Filas de Prioridade

Prof. Túlio Toffolo http://www.toffolo.com.br

BCC202 – Aula 17 Algoritmos e Estruturas de Dados I

FILAS DE PRIORIDADE

•! Aplicações: •! SOs usam filas de prioridades. •! Sistemas de gerência de memória usam a técnica de substituir a página menos utilizada na memória principal por uma nova página.Fila de Prioridade •! É uma estrutura de dados onde a chave de cada item reflete sua habilidade relativa de abandonar o conjunto de itens rapidamente. •! Métodos numéricos iterativos são baseados na seleção repetida de um item com maior (menor) valor. nas quais as chaves representam o tempo em que eventos devem ocorrer. 3 .

! Retira o item com maior chave.! Insere um novo item.! Aumenta o valor da chave do item i para um novo valor que é maior que o valor atual da chave. 4 .Fila de Prioridade •! Operações: 1. 4.! Constrói uma fila de prioridades a partir de um conjunto com n itens.! Informa qual é o maior item do conjunto.TAD . 3. 5. 2.

! Agrupar duas filas de prioridades em uma única. 9. 5 .TAD .! Substitui o maior item por um novo item. 8. a não ser que o novo item seja maior.Fila de Prioridade •! Operações: 6.! Remove um item qualquer.! Altera a prioridade de um item. 7.

•! Lista linear não ordenada: •! Constrói é O(n). •! Altera é O(n) 6 . •! Retira é O(1).Representação •! Lista linear ordenada: •! Constrói é O(n log n) ou O(n2). •! Retira é O(n). •! Altera é O(n). •! Insere é O(n).Filas de Prioridades . •! Insere é O(1).

FILA DE PRIORIDADE: HEAP .

Substitui e Altera é necessário utilizar estruturas de dados mais sofisticadas. Substitui e Altera são O(log n).Heap •! A melhor representação de uma fila de prioridade é através de uma estrutura de dados chamada heap: •! Neste caso. 8 . tais como árvores binomiais (Vuillemin. 1978). •! Observação: •! Para implementar a operação Agrupar de forma eficiente e ainda preservar um custo logarítmico para as operações Insere. Constrói é O(n). •! Insere. Retira. Retira.

Heap •! É uma árvore binária em que um nó filho é sempre maior ou igual a um nó pai. •! Ou seja: chave(v) ! chave(pai(v)) 2 5 9 7 6 nó raiz (menor elemento) 9 .

para 0 < k <= n/2. 10 . para 0 < k < n.Heap •! Árvore binária completa: •! Os nós são numerados de 0 a n-1. •! Os nós 2k+1 e 2k+2 são os filhos à esquerda e à direita do nó k. •! O nó (k-1)/2 é o pai do nó k. •! O primeiro nó é chamado raiz.

elemento) •! Assim. Sue) (5. cada nó do heap armazena todo o item sendo armazenado (2. Mark) 11 . Jeff) (7.Heap •! Cada nó possui uma tupla (chave. Pat) (9. Anna) (6.

•! A chave no nó raiz é a menor chave do conjunto.Heaps •! As chaves na árvore satisfazem a condição do heap. •! A chave em cada nó é menor do que as chaves em seus filhos. •! Uma árvore binária completa pode ser representada por um array: 0 2 1 5 2 6 3 9 4 7 5 8 6! 10! 12 .

•! Os filhos de um nó i estão nas posições 2i+1 e 2i+2. •! O pai de um nó i está na posição (i-1) div 2. •! Na representação do heap em um arranjo. a menor (ou maior) chave está sempre na posição 0 do vetor. 13 . •! Permite caminhar pelos nós da árvore facilmente.Heaps •! A representação é extremamente compacta.

. A[n/2 + 1]. •! Neste intervalo não existem dois índices i e j tais que j = 2i+1 ou j = 2i+2.Heaps •! Um algoritmo elegante para construir o heap foi proposto por Floyd em 1964.. .. •! Dado um vetor A[0]. A[n-1]: •! Os itens A[n/2]. A[1].. .. A[n-1] formam um heap válido pois são nós folhas (nós que não possuem filhos). 14 .. •! O algoritmo não necessita de nenhuma memória auxiliar.

Heaps 0 Vetor inicial! ! Esq = 2! ! Esq = 1! ! Esq = 0! ! Esq = 0! 9 ! 9 ! 9 ! 2 2 1 5 5 3 3 3 2 6 2 2 9 6 3 8 8 8 8 8 4 3 3 5 5 5 5 2 6 6 6 9 6! 7! 7! 7! 7! 7! 15 .

•! A condição de heap é violada: •! O heap é refeito trocando os itens A[2] e A[5]. •! O item 5 (A[1]) é incluindo no heap (Esq = 1) •! A condição de heap é violada: •! O heap é refeito trocando os itens A[1] e A[4]. pai dos itens A[5] e A[6]. •! O heap é estendido para a esquerda (Esq = 3).Heaps •! Os itens de A[3] a A[6] formam um heap. 16 . englobando o item A[2].

•! Como a condição ainda está sendo violada: •! O heap é refeito trocando os itens A[1] e A[4]. •! Como resultado. o heap foi construído: •! 2 3 6 8 5 9 7! 17 .Heaps •! O item 9 (A[0]) é incluindo no heap (Esq = 0) •! A condição de heap é violada: •! O heap é refeito trocando os itens A[0] e A[1].

OPERAÇÕES HEAP .

Inserir um Nó no Heap 2 5 9 7 z 6 Nó sendo inserido 2 5 9 7 6 Comparar o nó inserido com os pais e trocar enquanto ele for menor que o pai ou até que ele seja o nó raiz 19 z 1 .

Inserir um Nó no Heap •! Na pior das hipóteses o custo de uma inserção será O(n log n). equivalente à altura da árvore 2 5 9 7 1 z 6 1 5 9 7 2 z 6 20 .

Remover um Nó do Heap 2 5 6 w 9 7 último Nó 7 5 9 Trocar o nó raiz pelo 6 último nó do heap e remover o último nó w novo último Nó 21 .

equivalente à altura da árvore 7 5 9 6 w 5 7 9 22 w 6 .Remover um Nó do Heap •! Refazer o heap! •! Na pior das hipóteses o custo de uma remoção será O(n log n).

Perguntas? 23 .