Heap de Fibonacci
Alberto Rodrigues Costa Junior - (arcj)
Roteiro
• Introdução
• Estrutura
• Operações
• MAKE-HEAP
• INSERT
• MINIMUM
• UNION
• EXTRACT-MIN
• DECREASE-KEY
• DELETE
• Limite do grau máximo
Introdução
• Fredman e Tarjan em (Desenvolvido) 1984
/ (Publicado)1987.
• Aplicações em problemas de Menor
caminho, AGPM ...
Introdução
• Heaps binomiais suportam operações
Minimum, Extract Minimum, Union, Delete e
Decrease Key em tempo O(lgn) no pior caso.
• Heaps de Fibonacci suportam as mesmas
operações acima que não envolvem exclusão
em tempo amortizado O(1).
Introdução
Introdução
• Não foi desenvolvido para dar suporte eficiente
a operação de Search.
• Do ponto de vista prático, os fatores constantes
e a complexidade a tornam pouco desejável
para a maioria dos problemas.
Estrutura
• Semelhante ao HB, mas tem uma estrutura
bem menos rígida.
• HB: Consolida árvores depois de cada Insert.
• HF: Adia a consolidação até a próxima
exclusão
Estrutura
• Como HB, o HF é uma coleção de árvores.
• Também é coleção de heaps mínimos.
Estrutura
• Lista de raízes (circular e duplamente ligada).
• Ponteiro Min[H] apontado pra raiz que tiver menor valor.
• Cada nó x tem um ponteiro p[x] pro seu pai. E um ponteiro
child[x] pra um de seus filhos.
• Cada filho y esta em lista duplamente ligada e circular(left[y]
e right[y]).
Estrutura
• degree[x] - número de filhos de x.
• mark[x] - indica se o nó x perdeu um filho desde a ultima vez
que se tornou filho de outro nó.
• n[H] - número de nós em H.
Função Potencial
• Usada para analisar o desempenho de
operações de HF.
• t(H) o número de árvores.
• m(H) o número de nós marcados.
φ(H) = t(H) + 2m(H)
Operações
• Operações de heaps intercaláveis
• Make Heap
• Insert
• Minimum
• Union
• Extract Min
Operações
• Árvores Binomiais Não Ordenadas
• Uma árvore binomial não ordenada é
como uma arvore binomial:
• U0 consiste de apenas um nó
• Uk consiste de duas árvores binomiais não
ordenadas Uk-1, onde a raiz de uma delas
se torna filho da outra
Operações
• Propriedades de árvores binomiais não
ordenadas
• Para uma árvore binomial não ordenada U
vale:
• Há 2^k nós em Uk.
• A altura é k.
• Há exatamente
nós de profundidade i
para i = 0 ,1,...,k
• A raiz tem grau k, que é o maior grau de
qualquer outro nó. Os filhos da raiz são
raízes de árvores U0,U1, . . . Uk−1
emqualquer ordem
Operações
• Grau Máximo
• D(n) é o grau máximo de qualquer nó em um HF
com n nós
• Logo, se o HF é uma coleção de árvores binomiais
não ordenadas, então D(n) = lgn.
Make-Heap
Make-Heap()
1) n[H] = 0
2) min[H] = NIL
3) Retorna H
• t(H) = 0
• m(H) = 0
• Então φ(H) = 0+ 2*0 = 0
• Custo amortizado é igual ao custo real O(1)
Insert
Insert
Insert
• Seja H o heap de entrada e H’ heap resultante
t(H’) = t(H) + 1 e m(H’) = m(H) então o aumento
do potencial é :
((t(H) + 1) + 2m(H)) – (t(H) + 2m(H)) = 1
Como o custo real é O (1), o custo amortizado é (1) + 1 = Θ (1)
Minimum
• O nó mínimo é dado pelo ponteiro min[H].
Tempo real O(1) e tendo em vista que o
potencial não muda o custo amortizado desta
operação é igual ao seu custo real.
Union
Union
• Mudança de potencial:
φ(H) = φ(H1) + φ(H2)
= (t(H) + 2m(H)) - ((t(H1) + 2m(H1)) + (t(H2) + 2m(H2)) )
=0
Desse modo o custo amortizado de Union é
igual ao custo real Θ(1).
Extract-min
• O processo de extrair o nó minimo é mais complicado.
• Onde a consolidação das árvores finalmente ocorre.
Extract-min
Extract-min
Extract-min
Extract-min
• O(D(n)+ t(H)) + ((D(n)+1) + 2m(H)) – (t(H) +2m(H))
= O(D(n)) + O(t(h)) – t(h)
= O(D(n))
Decrease-key
• Aqui mostramos como a redução de uma chave de um
nó em um HF pode ser realizada com custo amortizado
O(1).
• Mais adiante, mostraremos que a deleção de um nó
pode ser executada em tempo amortizado O(D(n)).
• Essas operações não preservam a propriedade de que
todas as árvores no HF são árvores binomiais não
ordenadas.
• Estas árvores são “próximas” o suficiente para se limitar
o grau máximo D(n) por o(lgn).
Decrease-key
Decrease-key
Decrease-key
Decrease-key
Delete
Limitando o grau Máximo
• Para mostrar que a análise amortizada de Extract-Min e Delete
executam em tempo amortizado O(lgn), temos que mostrar
que D(n) (grau máximo de um nó em heap com n chaves) é da
ordem O(lgn).
• Se todas as árvores são árvores binomiais não ordenadas, então
D(n) = floor(lg(n)).
• Os cortes que ocorrem em Decrease Key, entretanto, podem fazer
com que as árvores do HF deixem de ser binomiais
• Mostrar que, em virtude de cortarmos um nó x do seu pai y
sempre que ele perde dois filhos, teremos D(n) é O(lgn)
Limitando o grau Máximo
• Para cada nó x de um HF, defina size(x) como o número de
nós, incluindo x, que pertencem à árvore com raiz em x.
• Vamos mostrar que size(x) é exponencial em degree[x].
• Lema
• Seja x um nó de um HF e suponha que degree[x] = k.
• Sejam y1, y2, . . . , yk os filhos de x na ordem que eles foram ligados
a x, a partir do primeiro ao último (mais recente).
• Então, degree[y1] >= 0 e degree[yi ]>= i −2, para i = 2, 3, . . . , k
Limitando o grau Máximo
• Prova
• Obviamente, degree[y1] >= 0.
• Para i >= 2, quando yi se tornou filho de x os
elementos y1, . . . , yi−1 eram filhos de x, logo
devemos ter degree[x] = i − 1.
• Note que yi é ligado a x apenas se degree[x] =
degree[yi ], portanto devemos ter degree[yi ] = i − 1
no momento da ligação.
• Dai concluímos que degree[yi ] >= i − 2.
Limitando o grau Máximo
• Finalmente atingimos a parte da análise que explica o nome
“Heap de Fibonacci”.
• Lembramos que a série Fibonacci é definida por:
• Lema:
Limitando o grau Máximo
• Prova por indução
caso base k = 0
= 1 + F0
=1+0
= 1 = F2
Limitando o grau Máximo
• Hipótese indutiva que Fk +1 = 1+
• F2 + k = Fk +1 + Fk +1
= Fk +(1 +
=1+
𝑘−1
𝑖=0 𝐹𝑖
𝑘
𝑖=0 𝐹𝑖
)
𝑘−1
𝑖=0 𝐹𝑖
Limitando o grau Máximo
• Lema:
Limitando o grau Máximo
Limitando o grau Máximo
• Lema:
• Seja x um nó de um HF
• Seja k = degree[x] o grau de x.
• Então
• Prova
• Sk é o menor valor possível size(x) de todos os nós z tais que
degree[z] = k
• Sk é no máximo size(x), e o valor de sk aumenta monotonicamente
com k
Limitando o grau Máximo
Limitando o grau Máximo
Limitando o grau Máximo
• Corolário:
Download

Seminário: Heap de Fibonacci