Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouEmanuelle Violante Alterado mais de 9 anos atrás
1
Listas de Prioridades Em muitas aplicações, dados de uma coleção são acessados por ordem de prioridade A prioridade associada a um dado pode ser qualquer coisa: tempo, custo, etc, mas precisa ser um escalar operações comuns (eficientes) Seleção do elemento com maior (ou menor) prioridade Remoção do elemento de maior (ou menor) prioridade Inserção de um novo elemento 1 1
2
Listas de Prioridade Implementação O(n) O(log n) O(1) Heap
O(n log n) Construção Alteração (de prioridade) Remoção (do menor) Inserção Seleção Árvore Balanceada Lista Ordenada Lista Operação O(n log n) O(n) Construção O(log n) Alteração (de prioridade) O(1) Remoção (do menor) Inserção Seleção Árvore Balanceada Lista Ordenada Lista Operação 2 2
3
Heaps – Lista de Prioridade
Podem ser pensadas como árvores binárias (mas não de busca) onde todos os nós possuem as propriedades chave do nó > chave à esquerda (se houver) chave do nó > chave à direita (se houver) Propriedade é válida para toda a árvore a raiz contém a chave de maior prioridade Implementação: não como árvores, heaps são implementados usando vetores ou listas sequenciais 3 3
4
Heaps – Lista de Prioridade
Dado um nó armazenado no índice i, é possível computar o índice do nó filho esquerdo de i : 2 i do nó filho direito de i : 2 i + 1 do nó pai de i : i div 2 si< s i/2 1 2 3 4 5 6 7 8 9 10 11 a b c d e f g h i j k 1 2 3 4 níveis 4 4
5
Heaps – Lista de Prioridade
Para armazenar uma árvore de altura h precisamos de um array de 2h – 1 (número de nós de uma árvore cheia de altura h) a 1 2 3 4 5 6 7 8 9 10 11 a b c d e f g h i j k b c 1 2 3 4 d e níveis f g h i j k 5 5
6
Alterando Prioridade em Heaps
alteração de uma chave: para manter a propriedade de heap, chaves podem migrar para baixo (se ele diminuir de valor) para cima (se ele aumentar de valor) Para cada uma dessas situações utiliza-se um algoritmo de migração: subir (i, n, S) migra o nó i para cima no heap S descer (i,n,S) migra o nó i para baixo no heap S n o número total de nós da heap 6 6
7
Migração de valores em Heap
pai – elemento si/2 proc Subir (i, n, S [1 .. n]) { se i > 1 e S [i/2] < S [i] então { trocar (S [i], S [i/2]) Subir (i/2, n, S) } 7 7
8
Migração de valores em Heap
proc Descer (i, n, S [1 .. n]) { se 2i+1 n e S [2i] > S [2i+1] então filho 2i senão filho 2i+1 se filho n e S [filho] > S [i] então { trocar (S [i], S [filho]) Descer (filho, n, S) } 8 8
9
Complexidade Qual a complexidade de subir() e descer () ? Por que? 9 9
10
HeapSort Ordenação: Construir o heap
Repetidamente remover o menor elemento e movê-lo para o fim da lista, acertando o heap: m = n; enquanto m > 1 fazer { trocar (S [1],S [m]); descer (1, m, S) m = m -1; } Complexidade? 10 10
11
Inserção em Heap Para inserir nova chave:
inserir novo valor na posição n + 1 do heap chamar Subir() proc Inserir (x, n, H [1 .. n + 1]) { n n + 1 H [n] x Subir (n, n, H) } 11 11
12
Remoção num Heap substituir a raiz S [1] por S (n) e chamar Descer
Obs.: em heap, remoção é da chave de maior prioridade proc Remover (n, H [1 .. n]) { H [1] H [n] n n – 1 Descer (1, n, H) } 12 12
13
Construção de Heaps Se queremos construir um Heap com n elementos, podemos recorrer a um algoritmo ingênuo, isto é, inserir os n elementos um a um num heap inicialmente vazio. Mais simplesmente, podemos colocar os n elementos no array H e “subí-los” um a um para i desde 2 até n fazer Subir (i, i, H) complexidade O(n log n) 13 13
14
Construção de Heaps Tem como melhorar a construção? O que fazer? 14 14
15
Construção de Heaps Entretanto, pode-se ordenar o heap em O(n) se observarmos: As folhas da árvore (elementos S [n/ n]) não têm descendentes e portanto já estão ordenadas em relação a eles Se acertarmos todos os nós internos (elementos S [1 .. n /2]) em relação a seus descendentes (rotina Descer), o heap estará pronto É preciso trabalhar de trás para frente desde n /2 até 1 pois as propriedades da heap são observadas apenas nos níveis mais baixos 15 15
16
Complexidade - construção de Heap
Suponhamos que a árvore seja cheia. Então, n = 2h – 1, onde h é a altura desses, apenas 2h – 1 – 1 são nós internos A raiz da árvore pode descer no máximo h – 1 níveis Os dois nós de nível 2 podem descer h – 2 níveis ... Os 2h – 2 nós de nível h – 1 podem descer 1 nível Logo, no total temos 16 16
17
Complexidade - construção de Heap
Para resolver esse somatório, dobramos S e a seguir subtraímos S agrupando os termos com mesma potência de 2 17 17
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.