Você está na página 1de 31

Heap, Filas de Prioridade e Heapsort

IF63C - Estrutura de Dados I


Prof. Andr Vignatti

Heap
Heap: uma rvore binria quase-completa rvore Binria Quase-Completa: rvore binria em que todos os nveis so completos, com exceo talvez do ltimo nvel. Um heap pode ser armazenado em um array A. A raiz da rvore A[1] O pai de A[i] A[i/2] (na verdade, o cho de i/2) Filho esquerdo de A[i] A[2i] Filho direito de A[i] A[2i +1]

OBS: Computaes rpidas so feitas atravs de implementao com representao binria.

Propriedade de Heap
Temos dois tipos de heap: max-heap e min-heap. Para max-heaps, a propriedade max-heap: o para todos nodos i, excluindo a raiz, A[pai(i)] >= A[i] Para min-heaps, a propriedade min-heap: o para todos nodos i, excluindo a raiz, A[pai(i)] <= A[i] Por induo e transitividade do <= (menor igual), a propriedade max-heap garante que o maior elemento est na raiz.
o

Mesma coisa para o min-heap, onde o menor elem. est na raiz.

Exemplo de Max-Heap
Exemplo de max-heap:

Mantendo a Propriedade do Heap


A seguir, apresentamos MAX-HEAPIFY, importante para manter a propriedade do max-heap. Antes de MAX-HEAPIFY, A[i] pode ser menor que algum de seus filhos. Assumimos que as sub-rvores direita e esquerda de i so max-heaps. (veremos depois como se livrar dessa suposio) Depois de MAX-HEAPIFY, a sub-rvore enraizada em i um max-heap.

Mantendo a Propriedade do Heap


Idia do MAX-HEAPIFY: Pega o maior entre i, left(i) e right(i) Se o maior no for i, ento troca o maior por i. Se houve a troca, a sub-rvore que sofreu a troca pode ter deixado de ser max-heap, ento chamamos MAX-HEAPIFY recursivamente.

Funo MAX-HEAPIFY

Exemplo de MAX-HEAPIFY

Nodo 2 viola a propriedade de maxheap. Compare 2 com seus filhos, e troque pelo maior dos dois filhos. Continue recursivamente.

MAX-HEAPIFY: Anlise
Afirmao: MAX-HEAPIFY executa em tempo O(log n). prova (esboo): Heap uma rvore binria quase completa, portanto a recurso avana em O(log n) nveis. Em cada nvel, temos um trabalho constante (comparar 3 itens, e talvez trocar 2).

Construindo um Heap
Dado um array desordenado, o seguinte procedimento constri um max-heap:

Idia: comea de baixo para cima (bottom-up) para garantir que MAX-HEAPIFY vai sempre operar sobre filhos que obedecem propriedade de max-heap. PERGUNTA: PORQUE COMEA DE N/2 AO INVS DE N?

Construindo um Heap
Dado um array desordenado, o seguinte procedimento constri um max-heap:

Idia: comea de baixo para cima (bottom-up) para garantir que MAX-HEAPIFY vai sempre operar sobre filhos que obedecem propriedade de max-heap. RESPOSTA: PORQUE DE N/2 AT N SO TODOS FOLHAS Ou seja, no precisa aplicar MAX-HEAPIFY!

BUILD-MAX-HEAP: Exemplo
No exemplo, i comea de 5. MAX-HEAPIFY aplicado nas sub-rvores enraizadas nos nodos (em ordem): 16, 2, 3, 1, 4.

BUILD-MAX-HEAP: Corretude
no trivial ver que BUILD-MAX-HEAP de fato constri um heap mximo. Devemos argumentar formalmente que ele funciona. Lema: No incio de cada iterao, cada nodo i+1, i+2, ... , n raiz de um max-heap. prova: No incio, i = n/2, e desta forma n/2, n/2+1, n/2 +2, ..., n so max-heaps pois so folhas. Filhos de i tem indices maiores que i e, usando a hiptese, os filhos so raizes de max-heaps. Pela hiptese, i+1, i+2, ..., n so todos razes de max-heaps, e ento MAX-HEAPIFY faz de i uma raiz de um max-heap.

BUILD-MAX-HEAP: Corretude

Teorema: BUILD-MAX-HEAP constri um max-heap. prova: Pelo lema anterior, quando o algoritmo chegar no final (ou seja, i=0), todos os nodos sero raizes de um max-heap. Em particular, o nodo 1 ser raiz de um max-heap.

BUILD-MAX-HEAP: Anlise
Queremos agora analisar o tempo de execuo do algoritmo. Temos O(n) chamadas a MAX-HEAPIFY, cada chamada leva O(log n). Portanto o tempo de execuo O(n log n) PERGUNTA: Ser que podemos melhorar esse limitante? IDEIA: A maioria dos nodos esto prximos as folhas, portanto as chamadas de MAX-HEAPIFY necessitam de menor nmero de recurses.

BUILD-MAX-HEAP: Anlise
Antes de continuar a anlise do algoritmo, vamos mostrar um resultado que ser til. Lema: Para 0 < q < 1, temos prova: Sabemos, pela equao de soma de PG infinita que:

Derivando ambos lados, temos:

BUILD-MAX-HEAP: Anlise
Teorema: BUILD-MAX-HEAP executa em tempo O(n). prova: Seja h a altura do heap. No nvel i<h, temos exatamente 2i nodos. No nvel h, temos no mximo 2h nodos. Os nodos no nvel h executam 0 recurses do MAX-HEAPIFY. Os nodos no nvel h-1 executam 1 recurso do MAX-HEAPIFY. Os nodos no nvel h-i executam i recurses do MAX-HEAPIFY.

BUILD-MAX-HEAP: Anlise
Teorema: BUILD-MAX-HEAP executa em tempo O(n). prova: Assim, os nodos no nvel h-i gastam O(i) cada um. Portanto, somando todos os nodos no nvel h-i, gastamos O(i2h-i) Somando para todos os nveis, o algoritmo gasta

OBS: Por questes de clareza, a notao O( ) foi omitida em alguns passos dessa prova.

BUILD-MAX-HEAP: Anlise
Teorema: BUILD-MAX-HEAP executa em tempo O(n). prova: Mas:

Os termos da somatria so sempre positivos, e portanto podemos limitar superiormente por

BUILD-MAX-HEAP: Anlise
Teorema: BUILD-MAX-HEAP executa em tempo O(n). prova: Usando o Lema anterior com q=1/2, temos

Sabemos que h = O(log n), portanto o nmero total de passos no mximo:

Filas de Prioridade
Heaps servem tambm para implementar filas de prioridade. Iremos falar sobre filas de prioridade mxima. Mas filas de prioridade mnima so implementadas de forma anloga usando min-heaps. Um heap um bom meio-termo entre rpida insero e lenta remoo e vice-versa, pois ambas operaes levam O(log n)

Filas de Prioridade
Operam sobre um conjunto S de elementos Cada elemento tem uma chave. Filas de Prioridade Mxima oferecem as seguintes operaes: INSERT(S,x): insere um elemento x no conjunto S MAXIMUM(S): devolve o elemento de S com maior chave EXTRACT-MAX(S): remove e devolve o elemento de S com maior chave INCREASE-KEY(S,x,k): aumenta o valor da chave do elemento x para k. As filas de prioridade mnima oferecem operaes "inversas", para operar com o menor elemento e diminuir o valor da chave.

Filas de Prioridade: maior elemento


Obter o maior elemento fcil: a raiz

Tempo: O(1)

Extraindo o maior elemento


Dado o array A: Testa se o heap no est vazio Faz uma cpia do maior elemento (raiz) Faz o ltimo nodo da rvore ser a nova raiz Refaz o heap, com um nodo a menos Retorna a cpia do maior elemento

Extraindo o maior elemento

Anlise: tempo constante mais o tempo de MAX-HEAPIFY Tempo: O(log n)

Extraindo o maior elemento: exemplo

Tira o 16 do nodo 1 Move 1 do nodo 10 para o nodo 1 Apaga nodo 10 MAX-HEAPIFY na raiz para preservar a propriedade de max-heap Note que extraes sucessivas remove itens em ordem reversa.

Aumentando uma chave


Dado um conjunto S, elemento x e novo valor da chave k: Testa se k maior ou igual chave atual de x Atualiza o valor da chave de x para k Percorre a rvore de baixo para cima comparando x com seu pai, trocando as chaves se necessrio, at a chave de x ser menor que a chave do seu pai

Aumentando uma chave

Anlise: percurso acima na rvore do nodo i tem tamanho O(log n) em um heap com n elementos. Tempo: O(log n)

Aumentando uma chave: exemplo

Aumentar a chave do nodo 9 para ter valor 15. o Troca as chaves dos nodos 4 e 9 o Depois troca as chaves dos nodos 2 e 4

Inserindo no heap
Dada chave k que ser inserida no heap: Insere novo nodo na ltima posio da rvore com chave - Aumente a chave

- para k usando HEAP-INCREASE-KEY

Inserindo no heap

Anlise: tempo constante + tempo de HEAP-INCREASE-KEY Tempo: O(log n)

Você também pode gostar