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

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

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: "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 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


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