Menu
Coddy logo textTech

Heap (heap binário)

Última atualização

Um heap binário é uma árvore binária completa que mantém o menor (min-heap) ou o maior (max-heap) valor na raiz. Esta visualização é um min-heap: cada pai é menor ou igual aos seus filhos. Para adicionar um valor você o insere na próxima posição livre e depois o "faz subir", trocando-o com o pai enquanto for menor, até que a propriedade de heap seja satisfeita novamente. Pressione reproduzir acima para ver cada novo valor subir até o seu lugar.

Como um heap é uma árvore completa, ele é armazenado de forma compacta em um array: os filhos do nó i ficam em 2i+1 e 2i+2. Inserir e remover o mínimo são O(log n) (um caminho da raiz até uma folha), enquanto consultar o mínimo é O(1) - exatamente o que uma fila de prioridade precisa.

Complexidade de tempo e espaço

OperaçãoComplexidadeNotas
Consultar mín/máxO(1)É sempre a raiz
Inserir (push)O(log n)Subir por um caminho
Remover mín/máxO(log n)Descer por um caminho
Construir o heapO(n)Heapify de uma vez
EspaçoO(n)Baseado em array, sem ponteiros

Passo a passo (push)

PassoO que acontece
1Adicione o novo valor ao final (a próxima folha livre).
2Compare-o com o seu pai.
3Se for menor (min-heap), troque-o para cima.
4Repita até que não seja mais menor que o pai ou alcance a raiz.

Exemplo resolvido

Construindo um min-heap ao inserir [5, 3, 8, 1, 4] um valor por vez:

PushArray após subirAção
5[5]O primeiro valor torna-se a raiz.
3[3, 5]3 < pai 5, então sobe até a raiz.
8[3, 5, 8]8 > pai 5, então permanece como folha.
1[1, 3, 8, 5]1 < pai 5, troca; depois 1 < pai 3, sobe até a raiz.
4[1, 3, 8, 5, 4]4 > pai 3, então permanece; o mínimo 1 continua na raiz.

Quando usar um heap

Use quandoEvite quando
Você precisa repetidamente do menor ou maior item de um conjunto que muda.Você precisa buscar valores arbitrários, não apenas o extremo - use um BST ou um conjunto hash.
Você está implementando uma fila de prioridade para Dijkstra, A* ou um agendador.Você precisa manter os dados totalmente ordenados o tempo todo.
Você quer inserção e remoção do mínimo em O(log n) com um layout de array compacto.Você precisa de busca ou remoção rápida de um elemento específico (não a raiz).
Você precisa mesclar um fluxo de itens e retirá-los por prioridade.O conjunto de dados é minúsculo e uma varredura linear é mais simples e rápida o bastante.

Código de Heap (Priority Queue)

Uma implementação limpa e executável de Heap (Priority Queue) em Python, JavaScript, Java, C++, C. Escolha uma linguagem, copie o código ou abra-o já carregado no Playground da Coddy.

Código de Heap (Priority Queue) em Python

Python
1class MinHeap:2    def __init__(self):3        self.data = []4
5    def push(self, value):6        # Append at the end, then bubble up to restore order7        self.data.append(value)8        i = len(self.data) - 19        while i > 0:10            parent = (i - 1) // 211            if self.data[parent] <= self.data[i]:12                break13            self.data[i], self.data[parent] = self.data[parent], self.data[i]14            i = parent15
16    def pop(self):17        # Move the last leaf to the root, then sift it down18        top = self.data[0]19        last = self.data.pop()20        if self.data:21            self.data[0] = last22            self._sift_down(0)23        return top24
25    def _sift_down(self, i):26        n = len(self.data)27        while True:28            smallest = i29            left, right = 2 * i + 1, 2 * i + 230            if left < n and self.data[left] < self.data[smallest]:31                smallest = left32            if right < n and self.data[right] < self.data[smallest]:33                smallest = right34            if smallest == i:35                return36            self.data[i], self.data[smallest] = self.data[smallest], self.data[i]37            i = smallest38
39
40heap = MinHeap()41for value in [5, 3, 8, 1, 9, 2]:42    heap.push(value)43
44print("Heap array:     ", heap.data)45print("Popped in order:", [heap.pop() for _ in range(6)])
Execute este código no Playground de Python

Perguntas frequentes sobre heaps

Para que serve um heap?
Heaps implementam filas de prioridade, que alimentam o algoritmo de caminho mais curto de Dijkstra, agendadores de tarefas e simulações de eventos. Também são o motor por trás do heapsort. Sempre que você precisar repetidamente do menor ou maior item de um conjunto que muda, um heap é a ferramenta.
Qual é a diferença entre um heap e uma árvore binária de busca?
Ambos são árvores binárias, mas uma BST mantém uma ordem completa da esquerda para a direita (permitindo busca ordenada), enquanto um heap só garante a relação pai-filho (mínimo ou máximo na raiz). Um heap dá acesso O(1) ao valor extremo; uma BST dá busca O(log n) para qualquer valor.
Por que um heap é armazenado em um array?
Como um heap é sempre uma árvore binária completa, seus nós mapeiam perfeitamente para índices de array: os filhos do índice i ficam em 2i+1 e 2i+2, e o pai em (i-1)/2. Isso evita armazenar ponteiros para os filhos e oferece excelente desempenho de cache.
Um heap é o mesmo que um array ordenado?
Não. Um heap só garante que cada pai seja menor (min-heap) ou maior (max-heap) que seus filhos, então irmãos e primos não têm ordem particular. Um array ordenado é totalmente ordenado, mas custa O(n) para inserir, enquanto um heap insere em O(log n) e ainda dá acesso instantâneo ao valor extremo.
Quando devo usar um heap em vez de simplesmente ordenar um array?
Recorra a um heap quando os dados mudam constantemente e você só precisa do mínimo ou máximo atual - inserir e retirar custam O(log n) cada, contra reordenar o array inteiro. Se você tem um conjunto de dados estático e quer todos os elementos em ordem, uma única ordenação O(n log n) é mais simples e muitas vezes mais rápida.
Construir um heap com n itens custa O(n log n)?
Não se você construí-lo de uma só vez. Inserir n itens um a um é O(n log n), mas o heapify de baixo para cima, que desce do último pai até a raiz, roda em O(n) no total, porque a maioria dos nós está perto do fundo e desce apenas uma distância curta.
Coddy programming languages illustration

Domine algoritmos com a Coddy

COMEÇAR