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

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

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.

Apresentações semelhantes


Apresentação em tema: "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."— Transcrição da apresentação:

1 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

2 2 Listas de Prioridade Implementação O(n log n)‏ O(n)‏Construção O(log n)‏O(n)‏ Alteração (de prioridade)‏ O(log n)‏O(1)‏O(n)‏ Remoção (do menor)‏ O(log n)‏O(n)‏O(1)‏Inserção O(log n)‏O(1)‏O(n)‏Seleção Árvore Balanceada Lista Ordenada ListaOperação O(n)‏ O(log n)‏ O(1)‏ Heap O(n log n)‏ O(n)‏Construção O(log n)‏O(n)‏ Alteração (de prioridade)‏ O(log n)‏O(1)‏O(n)‏ Remoção (do menor)‏ O(log n)‏O(n)‏O(1)‏Inserção O(log n)‏O(1)‏O(n)‏Seleção Árvore Balanceada Lista Ordenada ListaOperação

3 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

4 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 s i < s i/2 abcdefghijk níveis

5 5 Heaps – Lista de Prioridade Para armazenar uma árvore de altura h precisamos de um array de 2 h – 1 (número de nós de uma árvore cheia de altura h)‏ gf a cb ed ihkj abcdefghijk níveis

6 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

7 7 Migração de valores em Heap pai – elemento s i/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)‏ }

8 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) }

9 9 Complexidade Qual a complexidade de subir() e descer () ? Por que?

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

11 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)‏ }

12 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)‏ }

13 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)‏

14 14 Construção de Heaps Tem como melhorar a construção? O que fazer?

15 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

16 16 Complexidade - construção de Heap Suponhamos que a árvore seja cheia. Então, n = 2 h – 1, onde h é a altura desses, apenas 2 h – 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 2 h – 2 nós de nível h – 1 podem descer 1 nível Logo, no total temos

17 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


Carregar ppt "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."

Apresentações semelhantes


Anúncios Google