📂 O repositório está organizado em três TP's (Testes de Performance) e um Assessment Final. Aqui você encontrará:
- Códigos-fonte dos algoritmos e estruturas de dados implementados.
- Explicações detalhadas sobre cada conceito abordado.
- Exercícios práticos resolvidos durante a disciplina como avaliação.
- Na disciplina anterior, estudamos árvores binárias de busca, usadas para manter os dados ordenados.
- Agora, vamos estudar heaps, que são úteis para priorizar elementos, sem a necessidade de ordenação total.
- Uma fila de prioridade processa elementos conforme sua importância (não necessariamente por ordem de chegada).
- Exemplo: triagem médica – pacientes são atendidos conforme a gravidade.
- Implementações possíveis:
- Array ordenado: remoções rápidas (O(1)), mas inserções lentas (O(N)).
- Heap: melhor eficiência geral para inserir e remover elementos.
- Heap binário: tipo específico de árvore binária.
- Dois tipos:
- Heap máximo: maior valor na raiz.
- Heap mínimo: menor valor na raiz.
- Vamos focar no heap máximo.
- Propriedade de Heap: cada nó é maior (ou igual) que seus filhos.
- Árvore Completa: todos os níveis da árvore devem estar preenchidos, exceto o último, onde os nós devem estar o mais à esquerda possível.
- Vantagem: permite acessar rapidamente o maior valor (na raiz).
- Limitação: não é eficiente para buscas – heaps são apenas parcialmente ordenados.
- Passos do algoritmo:
- Adicionar o novo valor na próxima posição disponível (como "último nó").
- Comparar o novo nó com seu pai.
- Se o valor for maior, trocar com o pai e repetir até restaurar a propriedade de heap.
- Complexidade: O(log N) (porque o novo nó pode subir no máximo até a raiz).
- Regra: Sempre removemos a raiz.
- Passos do algoritmo:
- Substituir a raiz pelo último nó.
- Mover esse nó para baixo, trocando com o filho de maior valor até restaurar a propriedade de heap.
- Complexidade: O(log N) (porque o nó pode descer até a última camada).
- Para inserir ou remover elementos, precisamos localizar o último nó.
- O problema é que a raiz não tem acesso direto ao último nó.
- Podemos armazenar o heap como um array, associando cada nó a um índice.
- Vantagens:
- Último nó sempre será o último índice do array → acesso em O(1).
- Inserção e remoção ficam mais fáceis e eficientes.
- Array Ordenado: inserção lenta (O(N)), remoção rápida (O(1)).
- Heap: ambas as operações são O(log N), tornando-o a melhor escolha para filas de prioridade.
- Heaps são fundamentais para filas de prioridade.
- Inserção e remoção são eficientes, pois utilizam árvores completas.
- Implementar heaps com arrays resolve o problema do último nó de forma eficiente.
- São ótimos para priorização, mas não são eficientes para buscas.
- Definição de Heap como Árvore Binária Completa
- Ordenação Parcial em Heaps
- Operação de Inserção em um Heap
- Implementação da Função
eh_heap
para Verificação de Heap - Complexidade da Função
eh_heap
(Big O Notation) - Modificação da Classe Heap para Inicialização com um Array
- Criação de um Heap a Partir de um Array Específico
- Inserção de um Elemento no Heap
- Remoção do Nó Raiz do Heap
- Ordem de Remoção dos Elementos de um Heap
- Descrição de um Algoritmo de Ordenação Baseado em Heap
- Análise de Complexidade do Algoritmo de Ordenação HeapSort
- Implementação do Método
niveis
para Contar os Níveis do Heap - Fila de Prioridade com Heap para Atendimento Hospitalar
- Fila de Prioridade com Array Ordenado
- Comparação de Complexidade entre Heap e Array Ordenado na Fila de Prioridade
- **
- **
- **
- Utilização de estruturas de dados como Heaps e Tries.
- Manipulação e aplicação de grafos (graphs) em problemas reais.
- Desenvolvimento de algoritmos avançados com grafos.
- Resolução de problemas utilizando algoritmos gulosos e outras técnicas de otimização.