A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Katia S. Guimarães katia@cin.ufpe.br Heaps Katia S. Guimarães katia@cin.ufpe.br.

Apresentações semelhantes


Apresentação em tema: "Katia S. Guimarães katia@cin.ufpe.br Heaps Katia S. Guimarães katia@cin.ufpe.br."— Transcrição da apresentação:

1 Katia S. Guimarães katia@cin.ufpe.br
Heaps Katia S. Guimarães

2 Busca por Prioridade Até agora nós estudamos estruturas de
busca através de chaves. E se o nosso argumento de busca for diferente? Se nós quisermos recuperar, por exemplo, o elemento que tem a maior chave?

3 Estrutura Heap Heap é uma estrutura de prioridades,
na forma de árvore binária semi-completa, que representa uma ordem parcial entre os elementos do conjunto. Ex: 89 74 32 22 41 15 4 21 9 34 26 8

4 Estrutura Heap Implementação usual: Array unidimensional,
onde a raiz ocupa a posição 1, e os elementos obedecem à relação: esq.i = 2i, dir.i = 2i + 1. Ex: 89 74 32 22 41 15 4 21 9 34 26 8 89 74 32 22 41 15 4 21 9 34 26 8

5 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.

6 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 Ex: 9 Ex: 34 34 9 21

7 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 34 9 21 21 34 9 34 9 21

8 Heapify Toma: Dois (sub)heaps + um novo elemento 
Gera:  um novo heap contendo todos. Ex. 9 74 41 21 22 34 26 74 22 41 21 9 34 26 9 74 22 41 74 41 21 9 34 26 21 22 34 26

9 Heapify 9 74 41 21 22 34 26 74 22 41 21 9 34 26 9 74 22 41 74 41 21 9 34 26 21 22 34 26 Só precisamos encontrar um local apropriado para o elemento nesta nova raiz.

10 Algoritmo Heapify Algoritmo Heapify(i )
Enquanto i  int (n/2) /* i tem filhos*/ faça { Se i < (n/2) /* i tem dois filhos*/ então Se A[2i ] > A[2i +1] então maior  2i senão maior  2i +1 senão /* O único é o maior*/ maior  2i ; Se A[i ] < A[maior] então { A[i ]  A[maior]; i  maior } senão i  n /* deixe o laço*/ }

11 Heapify i=1 9 74 i=2 9 41 74 41 21 22 34 26 21 22 34 26 74 i=7 74 22 41 22 41 i=5 21 9 34 26 21 9 34 26

12 Construindo um Heap Bottom-up
Algoritmo Constrói-Heap: Para i  int (n/2) até 1 faça Heapify 9 22 34 21 74 41 26 9 22 41 21 74 34 26 9 9 22 34 22 41 21 74 41 26 21 74 34 26

13 Construindo um Heap Bottom-up
9 22 41 21 74 34 26 9 74 41 21 22 34 26 9 9 22 41 74 41 21 74 34 26 21 22 34 26

14 Construindo um Heap Bottom-up
9 74 41 21 22 34 26 74 22 41 21 9 34 26 9 74 74 41 22 41 21 22 34 26 21 9 34 26

15 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?

16 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

17 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 H(h) 2h

18 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 H(h) 2h H(h) = 2h+1 - (h+2) = O (n)


Carregar ppt "Katia S. Guimarães katia@cin.ufpe.br Heaps Katia S. Guimarães katia@cin.ufpe.br."

Apresentações semelhantes


Anúncios Google