Heaps Katia S. Guimarães
Estrutura Heap Heap é uma estrutura de prioridades na forma de árvore binária completa, que representa uma ordem parcial entre os elementos do conjunto. Ex:
Estrutura Heap Ex: Implementação usual: array unidimensional, onde a raiz ocupa a posição 1, e os elementos obedecem à relação: esq. i = 2 i, dir. i = 2 i
Construção de um Heap A construção é feita a partir do array com os elementos desordenados, e pode ser feita “bottom-up” ou “top-down”. Na construção bottom-up, o controle segue das folhas à raiz (ou seja, da direita para a esquerda no array), construindo um heap único a partir de dois heaps menores + um novo elemento.
Construindo um Heap Bottom-up Base: Se n = 1, então a árvore é uma folha, não há o que fazer (a árvore já é um heap) Ex: 9 34
Construindo um Heap Bottom-up Passo: Se n > 1, então usando a Hipótese de Indução, só é necessário ajustar a ordem parcial com relação ao novo elemento Ex:
Heapify Toma dois (sub)heaps mais um novo elemento e constrói um novo heap contendo todos. Ex
Heapify Toma dois (sub)heaps mais um novo elemento e constrói um novo heap contendo todos. A situação é similar ao rearranjo de um heap após a remoção de um elemento, quando tomamos o último elemento e o “promovemos para a raiz”. Só precisamos encontrar um local apropriado para o elemento nesta nova raiz.
Heapify 22
Algoritmo Heapify Algoritmo Heapify( i ) Enquanto i int (n/2) /* i tem filhos */ faça { Se i < int(n/2) /* i tem dois filhos */ então Se A[ 2 i ] > A[ 2 i + 1 ] então maior 2 i senão maior 2 i + 1 senão /* O único é o maior */ maior 2 i ; Se A[ i ] < A[maior] então { A[ i ] A[maior]; i maior } senão i n + 1 /* deixe o laço */ }
Construindo um Heap Bottom-up Algoritmo Constrói-Heap: Para i n/2 até 1 faça Heapify
Construindo um Heap Bottom-up Algoritmo Constrói-Heap: Para i n/2 até 1 faça Heapify( i )
Construindo um Heap Bottom-up
Construindo um Heap Bottom-up
Construindo um Heap Bottom-up Algoritmo Constrói-Heap: Para i n/2 até 1 faça Heapify (A, n, i) Custo para construir um heap: T(n) = n / 2 · log (n) = O (n · log (n)) Será que este custo é exato?