Heaps Katia S Guimares katiacin ufpe br maio2000
Heaps Katia S. Guimarães katia@cin. ufpe. br maio/2000 katia@cin. ufpe. br 1
Estrutura Heap é uma estrutura de prioridades na forma de árvore binária completa, que representa uma ordem parcial entre os elementos do conjunto. 89 Ex: 74 32 22 21 maio/2000 41 9 34 15 26 4 8 katia@cin. ufpe. br 2
Estrutura Heap 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 + 1. Ex: 89 74 32 22 41 15 4 21 9 34 26 8 89 74 32 22 21 maio/2000 41 9 34 15 26 4 8 katia@cin. ufpe. br 3
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. maio/2000 katia@cin. ufpe. br 4
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: 21 21 maio/2000 Ex: 9 9 katia@cin. ufpe. br Ex: 34 34 5
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: 21 9 34 maio/2000 9 21 9 34 34 34 9 katia@cin. ufpe. br 21 21 6
Heapify Toma dois (sub)heaps mais um novo elemento e constrói um novo heap contendo todos. Ex. 9 74 41 21 22 34 26 9 maio/2000 22 21 34 9 34 22 21 26 katia@cin. ufpe. br 26 74 41 22 41 74 21 74 41 9 34 26 7
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. maio/2000 katia@cin. ufpe. br 8
Heapify 9 74 21 74 9 41 22 34 21 26 41 22 34 26 74 74 22 21 maio/2000 41 9 34 26 22 21 katia@cin. ufpe. br 41 9 34 26 9
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*/ } maio/2000 katia@cin. ufpe. br 10
Construindo um Heap Bottom-up Algoritmo Constrói-Heap: Para i n/2 até 1 faça Heapify 9 22 34 21 74 41 26 9 22 41 21 9 maio/2000 34 74 34 26 9 22 21 74 41 26 katia@cin. ufpe. br 22 21 41 74 34 26 11
Construindo um Heap Bottom-up Algoritmo Constrói-Heap: Para i n/2 até 1 faça Heapify(i ) 9 22 34 21 74 41 26 9 22 41 21 9 maio/2000 34 74 34 26 9 22 21 74 41 26 katia@cin. ufpe. br 22 21 41 74 34 26 12
Construindo um Heap Bottom-up 9 22 41 21 74 34 26 9 74 41 21 9 maio/2000 41 74 34 26 9 22 21 22 34 74 26 katia@cin. ufpe. br 21 41 22 34 26 13
Construindo um Heap Bottom-up 9 74 41 21 22 34 9 maio/2000 74 22 21 34 9 22 26 21 katia@cin. ufpe. br 34 26 74 41 22 41 74 21 26 41 9 34 26 14
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? maio/2000 katia@cin. ufpe. br 15
- Slides: 15