Академический Документы
Профессиональный Документы
Культура Документы
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]
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
Exemplo de Max-Heap
Exemplo de max-heap:
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:
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:
BUILD-MAX-HEAP: Anlise
Teorema: BUILD-MAX-HEAP executa em tempo O(n). prova: Usando o Lema anterior com q=1/2, temos
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.
Tempo: O(1)
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.
Anlise: percurso acima na rvore do nodo i tem tamanho O(log n) em um heap com n elementos. Tempo: O(log n)
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
Inserindo no heap