Heapsort Katia S Guimares katiacin ufpe br maio2000
Heapsort 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
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 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 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 12
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 13
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 14
Custo para construir um Heap Bottom-up A cada execução da rotina Heapify o número de comparações é no máximo o dobro da altura da sub-árvore que está sendo transformada em heap. Logo, no total queremos a soma das alturas de todas as sub-árvores dentro de uma árvore de altura h: H(h) = 2 · H(h-1) + h maio/2000 katia@cin. ufpe. br 15
Custo para construir um Heap Bottom-up A soma das alturas de todas as sub-árvores dentro de uma árvore de altura h é dada por: H(h) = 2 · H(h-1) + h H(0) = 0 maio/2000 h 0 1 H(h) 0 1 2 4 3 11 4 26 5 57 6 7. . . 120 247. . . 2 h+1 2 8 16 32 64 128 4 katia@cin. ufpe. br 256. . . 16
Custo para construir um Heap Bottom-up A soma das alturas de todas as sub-árvores dentro de uma árvore de altura h é dada por: H(h) = 2 · H(h-1) + h H(0) = 0 h 0 1 H(h) 0 1 2 4 3 11 4 26 5 57 6 7. . . 120 247. . . 2 h+1 2 8 16 32 64 128 4 256. . . H(h) = 2 h+1 - (h+2) = (n) maio/2000 katia@cin. ufpe. br 17
Heapsort Após construir o heap, o array é visto como contendo um heap + parte da solução: 74 41 34 21 9 22 26 41 maio/2000 22 41 21 9 34 26 41 26 34 21 9 22 74 74 21 74 41 34 9 22 26 26 katia@cin. ufpe. br 21 34 9 22 74 18
Heapsort 41 26 34 21 9 22 74 34 26 22 21 9 41 74 41 34 26 21 maio/2000 34 9 22 74 katia@cin. ufpe. br 26 21 22 9 41 74 19
Heapsort 34 26 22 21 9 41 74 26 21 22 9 34 41 74 34 26 26 21 maio/2000 22 9 41 74 katia@cin. ufpe. br 21 9 22 34 41 74 20
Heapsort 26 21 22 9 34 41 74 22 21 9 26 34 41 74 26 22 21 9 maio/2000 22 34 41 74 katia@cin. ufpe. br 21 26 9 34 41 74 21
Heapsort 22 21 9 26 34 41 74 21 9 22 26 34 41 74 22 21 21 26 maio/2000 9 34 41 74 katia@cin. ufpe. br 9 26 22 34 41 74 22
Heapsort 21 9 22 26 34 41 74 9 21 22 26 34 41 74 21 9 9 26 maio/2000 22 34 41 74 katia@cin. ufpe. br 21 26 22 34 41 74 23
Heapsort Algoritmo Heapsort: Constrói-Heap(A, n) Para j n até 2 faça {Trocar (A[1], A[ j ]); Heapify (A, j, 1) } maio/2000 katia@cin. ufpe. br 24
Heapsort Custo do Heapsort: T(n) = Custo (Constrói-Heap) + Custo (laço) T(n) = [ (n)] + [n · log (n)] = = (n · log (n) ) OBS: 1. A constante do Heapsort é menor que a do MS. 2. Em termos de espaço, o Heapsort é um algoritmo in-place. maio/2000 katia@cin. ufpe. br 25
- Slides: 25