Professional Documents
Culture Documents
20 de setembro de 2007
Introdução
Introdução
Estrutura
Introdução
Estrutura
Análise amortizada
Introdução
Estrutura
Análise amortizada
Operações
MAKE-HEAP
INSERT
MINIMUM
UNION
EXTRACT-MIN
DECREASE-KEY
DELETE
Introdução
Estrutura
Análise amortizada
Operações
MAKE-HEAP
INSERT
MINIMUM
UNION
EXTRACT-MIN
DECREASE-KEY
DELETE
Limite do grau máximo
Introdução
Estrutura
Análise amortizada
Operações
MAKE-HEAP
INSERT
MINIMUM
UNION
EXTRACT-MIN
DECREASE-KEY
DELETE
Limite do grau máximo
Conclusão
Heap
Binário Binomial Fibonacci
Operação (pior caso) (pior caso) (amortizado)
MAKE-HEAP Θ(1) Θ(1) Θ(1)
INSERT Θ(lg n) O(lg n) Θ(1)
MINIMUM Θ(1) O(lg n) Θ(1)
UNION Θ(n) O(lg n) Θ(1)
DECREASE-KEY Θ(lg n) Θ(lg n) Θ(1)
EXTRACT-MIN Θ(lg n) Θ(lg n) O(lg n)
DELETE Θ(lg n) Θ(lg n) O(lg n)
min[H]
23 7 3 17 24
18 52 38 30 26 46
39 41 35
min[H]
23 7 3 17 24
18 52 38 30 26 46
39 41 35
Algoritmo
INCREMENT(A)
1. i = 0
2. Enquanto i < length(A) e A[i] = 1 faça
3. A[i] = 0
4. i = i + 1
5. Se i < length(A) ent~
ao
6. A[i] = 1
Algoritmo
INCREMENT(A)
1. i = 0
2. Enquanto i < length(A) e A[i] = 1 faça
3. A[i] = 0
4. i = i + 1
5. Se i < length(A) ent~
ao
6. A[i] = 1
Método potencial
Método potencial
Estrutura inicial D0 , onde executamos n operações
Método potencial
Estrutura inicial D0 , onde executamos n operações
ci , para cada i = 1, 2, . . . , n, é o custo real da i-ésima
operação em Di−1 que gera Di
Método potencial
Estrutura inicial D0 , onde executamos n operações
ci , para cada i = 1, 2, . . . , n, é o custo real da i-ésima
operação em Di−1 que gera Di
Função potencial Φ mapeia Di a um número real Φ(Di ), o
potencial
Método potencial
Estrutura inicial D0 , onde executamos n operações
ci , para cada i = 1, 2, . . . , n, é o custo real da i-ésima
operação em Di−1 que gera Di
Função potencial Φ mapeia Di a um número real Φ(Di ), o
potencial
O custo amortizado cbi da i-ésima operação é:
Método potencial
Estrutura inicial D0 , onde executamos n operações
ci , para cada i = 1, 2, . . . , n, é o custo real da i-ésima
operação em Di−1 que gera Di
Função potencial Φ mapeia Di a um número real Φ(Di ), o
potencial
O custo amortizado cbi da i-ésima operação é:
n
X n
X n
X
cbi = (ci + Φ(Di ) − Φ(Di−1 )) = ci +Φ(Dn )−Φ(D1 )
i=1 i=1 i=1
Contador binário
Contador binário
Φ(Di ) = bi , onde bi é o número de 1’s
Contador binário
Φ(Di ) = bi , onde bi é o número de 1’s
ti resets. Custo real da operação é ci = ti + 1
Contador binário
Φ(Di ) = bi , onde bi é o número de 1’s
ti resets. Custo real da operação é ci = ti + 1
Custo amortizado da operação
Contador binário
Φ(Di ) = bi , onde bi é o número de 1’s
ti resets. Custo real da operação é ci = ti + 1
Custo amortizado da operação
Contador binário
Φ(Di ) = bi , onde bi é o número de 1’s
ti resets. Custo real da operação é ci = ti + 1
Custo amortizado da operação
Contador binário
Φ(Di ) = bi , onde bi é o número de 1’s
ti resets. Custo real da operação é ci = ti + 1
Custo amortizado da operação
Contador binário
Φ(Di ) = bi , onde bi é o número de 1’s
ti resets. Custo real da operação é ci = ti + 1
Custo amortizado da operação
min[H]
23 7 3 17 24
18 52 38 30 26 46
39 41 35
Algoritmo
MAKE-HEAP()
1. n[H] = 0
2. min[H] = NIL
3. retorna H
Algoritmo
MAKE-HEAP()
1. n[H] = 0
2. min[H] = NIL
3. retorna H
Análise amortizada
cbi = ci = O(1)
Algoritmo
INSERT(H,x)
1. degree[x] = 0
2. p[x] = NIL
3. child[x] = NIL
4. left[x] = x
5. right[x] = x
6. mark[x] = FALSE
7. concatena as listas de raı́zes H e a de x
8. Se min[H] = NIL ou key[x] < key[min[H]] ent~
ao
9. min[H] = x
10. n[H] = n[H] + 1
Inserir: 21
min[H]
23 7 3 17 24
18 52 38 30 26 46
39 41 35
min[H]
23 7 21 3 17 24
18 52 38 30 26 46
39 41 35
Algoritmo
MINIMUM(H)
1. retorna min[H]
Algoritmo
MINIMUM(H)
1. retorna min[H]
Análise amortizada
Algoritmo
MINIMUM(H)
1. retorna min[H]
Análise amortizada
t(H ′ ) = t(H)
Algoritmo
MINIMUM(H)
1. retorna min[H]
Análise amortizada
t(H ′ ) = t(H)
m(H ′ ) = m(H)
Algoritmo
MINIMUM(H)
1. retorna min[H]
Análise amortizada
t(H ′ ) = t(H)
m(H ′ ) = m(H)
Φ(H ′ ) − Φ(H) = 0
Algoritmo
MINIMUM(H)
1. retorna min[H]
Análise amortizada
t(H ′ ) = t(H)
m(H ′ ) = m(H)
Φ(H ′ ) − Φ(H) = 0
Custo amortizado da operação
min[H]
23 7 3 17 24
18 52 38 30 26 46
39 41 35
Algoritmo
UNION(H1 ,H2 )
1. H = MAKE-HEAP()
2. min[H] = min[H1 ]
3. concatena as listas de raı́zes de H2 com a de H
4. Se (min[H1 ] = NIL) ou
5. (min[H2 ] 6= NIL e min[H2 ] < min[H1 ]) ent~
ao
6. min[H] = min[H2 ]
7. n[H] = n[H1 ] + n[H2 ]
8. retorna H
min[H] min[H]
23 7 24 3 17
26 46 18 52 38 30
35 39 41
min[H]
23 7 3 17 24
18 52 38 30 26 46
39 41 35
Algoritmo
EXTRACT-MIN(H)
1. z = min[H]
2. Se z 6= NIL ent~ao
3. Para cada filho x de z faça
4. adiciona x a lista de raı́zes de H
5. p[x] = NIL
6. remove z da lista de raı́zes de H
7. Se z = right[z] ent~ao
8. min[H] = NIL
9. Sen~
ao
10. min[H] = right[z]
11. CONSOLIDATE(H)
12. n[H] = n[H] - 1
13. retorna z
CONSOLIDATE(H)
Repetidamente executa os seguintes passos até que toda raiz
possua um grau distinto.
1 Encontrar duas raı́zes x e y com mesmo grau tal que
key [x] ≤ key [y ].
2 Remover y da lista de raı́zes e tornar y filho de x.
Incrementar degree[x] e mark[y ] = FALSE .
min[H]
23 7 21 3 17 24
18 52 38 30 26 46
39 41 35
min[H]
23 7 21 18 52 38 17 24
39 41 30 26 46
35
0 1 2 3
A
x
23 7 21 18 52 38 17 24
39 41 30 26 46
35
0 1 2 3
A
x
23 7 21 18 52 38 17 24
39 41 30 26 46
35
0 1 2 3
A
x
23 7 21 18 52 38 17 24
39 41 30 26 46
35
0 1 2 3
A
x
7 21 18 52 38 17 24
23 39 41 30 26 46
35
0 1 2 3
A
x
7 21 18 52 38 24
17 23 39 41 26 46
30 35
0 1 2 3
A
x
7 21 18 52 38
24 17 23 39 41
26 46 30
35
0 1 2 3
A
x
7 21 18 52 38
24 17 23 39 41
26 46 30
35
0 1 2 3
A
x
7 21 18 52 38
24 17 23 39 41
26 46 30
35
x
7 21 18 38
24 17 23 52 39 41
26 46 30
35
0 1 2 3
A
x
7 18 38
24 17 23 21 39 41
26 46 30 52
35
0 1 2 3
A
x
7 18 38
24 17 23 21 39 41
26 46 30 52
35
min[H]
7 18 38
24 17 23 21 39 41
26 46 30 52
35
Algoritmo
EXTRACT-MIN(H)
1. z = min[H]
2. Se z 6= NIL ent~ao
3. Para cada filho x de z faça
4. adiciona x a lista de raı́zes de H
5. p[x] = NIL
6. remove z da lista de raı́zes de H
7. Se z = right[z] ent~ao
8. min[H] = NIL
9. Sen~
ao
10. min[H] = right[z]
11. CONSOLIDATE(H)
12. n[H] = n[H] - 1
13. retorna z
Algoritmo
DECREASE-KEY(H,x,k)
1. Se k > key[x] ent~ao
2. erro ‘‘Nova chave é maior’’
3. key[x] = k
4. y = p[x]
5. Se y 6= NIL e key[x] < key[y] ent~
ao
6. CUT(H,x,y)
7. CASCADING-CUT(H,y)
8. Se key[x] < key[min[H]] ent~ ao
9. min[H] = x
Algoritmo
CUT(H,x,y)
1. remove x da lista de filhos de y e decrementa
degree[y]
2. adiciona x à lista de raı́zes de H
3. p[x] = NIL
4. mark[x] = FALSE
Algoritmo
CASCADING-CUT(H,y)
1. z = p[y]
2. Se z 6= NIL ent~ao
3. Se mark[y] = FALSE ent~
ao
4. mark[y] = TRUE
5. Sen~
ao
6. CUT(H,y,z)
7. CASCADING-CUT(H,z)
min[H]
7 18 38
24 17 23 21 39 41
26 46 30 52
35
min[H]
15 7 18 38
24 17 23 21 39 41
26 30 52
35
min[H]
15 5 7 18 38
24 17 23 21 39 41
26 30 52
min[H]
15 5 26 7 18 38
24 17 23 21 39 41
30 52
min[H]
15 5 26 24 7 18 38
17 23 21 39 41
30 52
min[H]
15 5 26 24 6 7 18 38
30 23 21 39 41
52
Algoritmo
DECREASE-KEY(H,x,k)
1. Se k > key[x] ent~ao
2. erro ‘‘Nova chave é maior’’
3. key[x] = k
4. y = p[x]
5. Se y 6= NIL e key[x] < key[y] ent~
ao
6. CUT(H,x,y)
7. CASCADING-CUT(H,y)
8. Se key[x] < key[min[H]] ent~ ao
9. min[H] = x
Algoritmo
CUT(H,x,y)
1. remove x da lista de filhos de y e decrementa
degree[y]
2. adiciona x à lista de raı́zes de H
3. p[x] = NIL
4. mark[x] = FALSE
Algoritmo
CASCADING-CUT(H,y)
1. z = p[y]
2. Se z 6= NIL ent~ao
3. Se mark[y] = FALSE ent~
ao
4. mark[y] = TRUE
5. Sen~
ao
6. CUT(H,y,z)
7. CASCADING-CUT(H,z)
Algoritmo
DELETE(H,x)
1. DECREASE-KEY(H,x,-∞)
2. EXTRACT-MIN(H)
Algoritmo
DELETE(H,x)
1. DECREASE-KEY(H,x,-∞)
2. EXTRACT-MIN(H)
Fibonacci
0 se k = 0
Fk = 1 se k = 1
Fk−1 + Fk−2 se k ≥ 2
Fibonacci
0 se k = 0
Fk = 1 se k = 1
Fk−1 + Fk−2 se k ≥ 2
k 0 1 2 3 4 5 6 7 8 9 10
Fk 0 1 1 2 3 5 8 13 21 34 55
Fibonacci
0 se k = 0
Fk = 1 se k = 1
Fk−1 + Fk−2 se k ≥ 2
k 0 1 2 3 4 5 6 7 8 9 10
Fk 0 1 1 2 3 5 8 13 21 34 55
Lema 20.2
Para todo inteiro k ≥ 0,
k
X
Fk+2 = 1 + Fi
i=0
k−1
! k
X X
Fk+2 = Fk + Fk+1 = Fk + 1+ Fi =1+ Fi
i=0 i=0
Lema 20.1
Seja x um nó qualquer em um heap de Fibonacci e degree[x] = k.
Se y1 , y2 , . . . , yk denota os filhos de x na ordem na qual eles foram
ligados a x então degree[y1 ] ≥ 0 e degree[yi ] ≥ i − 2 para
i = 2, 3, . . . , k.
Lema 20.1
Seja x um nó qualquer em um heap de Fibonacci e degree[x] = k.
Se y1 , y2 , . . . , yk denota os filhos de x na ordem na qual eles foram
ligados a x então degree[y1 ] ≥ 0 e degree[yi ] ≥ i − 2 para
i = 2, 3, . . . , k.
Lema 20.1
Seja x um nó qualquer em um heap de Fibonacci e degree[x] = k.
Se y1 , y2 , . . . , yk denota os filhos de x na ordem na qual eles foram
ligados a x então degree[y1 ] ≥ 0 e degree[yi ] ≥ i − 2 para
i = 2, 3, . . . , k.
Lema 20.1
Seja x um nó qualquer em um heap de Fibonacci e degree[x] = k.
Se y1 , y2 , . . . , yk denota os filhos de x na ordem na qual eles foram
ligados a x então degree[y1 ] ≥ 0 e degree[yi ] ≥ i − 2 para
i = 2, 3, . . . , k.
Lema 20.1
Seja x um nó qualquer em um heap de Fibonacci e degree[x] = k.
Se y1 , y2 , . . . , yk denota os filhos de x na ordem na qual eles foram
ligados a x então degree[y1 ] ≥ 0 e degree[yi ] ≥ i − 2 para
i = 2, 3, . . . , k.
Lema 20.1
Seja x um nó qualquer em um heap de Fibonacci e degree[x] = k.
Se y1 , y2 , . . . , yk denota os filhos de x na ordem na qual eles foram
ligados a x então degree[y1 ] ≥ 0 e degree[yi ] ≥ i − 2 para
i = 2, 3, . . . , k.
Lema 20.3
Se x é um nó qualquer de um heap de Fibonacci e k = degree[x]
então size(x) ≥ Fk+2 ≥ φk .
Lema 20.3
Se x é um nó qualquer de um heap de Fibonacci e k = degree[x]
então size(x) ≥ Fk+2 ≥ φk .
Lema 20.3
Se x é um nó qualquer de um heap de Fibonacci e k = degree[x]
então size(x) ≥ Fk+2 ≥ φk .
Lema 20.3
Se x é um nó qualquer de um heap de Fibonacci e k = degree[x]
então size(x) ≥ Fk+2 ≥ φk .
k
X k
X k
X
sk ≥ 2 + si−2 ≥ 2 + Fi = 1 + Fi = Fk+2 ≥ φk
i=2 i=2 i=0
Corolário 20.4
O grau máximo D(n) de qualquer nó de um heap de Fibonacci
com n elementos é O(lg n).
Corolário 20.4
O grau máximo D(n) de qualquer nó de um heap de Fibonacci
com n elementos é O(lg n).
Corolário 20.4
O grau máximo D(n) de qualquer nó de um heap de Fibonacci
com n elementos é O(lg n).
Corolário 20.4
O grau máximo D(n) de qualquer nó de um heap de Fibonacci
com n elementos é O(lg n).
Corolário 20.4
O grau máximo D(n) de qualquer nó de um heap de Fibonacci
com n elementos é O(lg n).
Corolário 20.4
O grau máximo D(n) de qualquer nó de um heap de Fibonacci
com n elementos é O(lg n).
Heap
Binário Binomial Fibonacci
Operação (pior caso) (pior caso) (amortizado)
MAKE-HEAP Θ(1) Θ(1) Θ(1)
INSERT Θ(lg n) O(lg n) Θ(1)
MINIMUM Θ(1) O(lg n) Θ(1)
UNION Θ(n) O(lg n) Θ(1)
DECREASE-KEY Θ(lg n) Θ(lg n) Θ(1)
EXTRACT-MIN Θ(lg n) Θ(lg n) O(lg n)
DELETE Θ(lg n) Θ(lg n) O(lg n)