Jogo de Rimas - Para impressão em pdf a ser usado para crianças
(ACH2002) Introdução à Análise de Algoritmos - Aula 16
1. Aula 16 – Heaps
Norton Trevisan Roman
norton@usp.br
16 de outubro de 2018
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 1 / 27
2. Heaps
Defini¸c˜ao
Estrutura de dados definida como uma sequˆencia S
de itens com valores S[1], S[2], . . . , S[n] tais que
S[i] ≥ S[2i]
S[i] ≥ S[2i + 1]
para todo i = 1, 2, . . . , n/2
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 2 / 27
3. Heaps
Defini¸c˜ao
Estrutura de dados definida como uma sequˆencia S
de itens com valores S[1], S[2], . . . , S[n] tais que
S[i] ≥ S[2i]
S[i] ≥ S[2i + 1]
para todo i = 1, 2, . . . , n/2
Heap m´aximo
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 2 / 27
4. Heaps
Defini¸c˜ao
Se, contudo, quisermos um heap m´ınimo, basta
mudarmos a defini¸c˜ao para
S[i] ≤ S[2i]
S[i] ≤ S[2i + 1]
para todo i = 1, 2, . . . , n/2
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 3 / 27
5. Heaps
Visualiza¸c˜ao
Para entender o heap, considere uma uma ´arvore
bin´aria completa
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
6. Heaps
Visualiza¸c˜ao
Para entender o heap, considere uma uma ´arvore
bin´aria completa
Ou seja, a ´arvore bin´aria em que todas as folhas tˆem a
mesma profundidade e todos os n´os internos tˆem 2 filhos
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
7. Heaps
Visualiza¸c˜ao
Para entender o heap, considere uma uma ´arvore
bin´aria completa
Ou seja, a ´arvore bin´aria em que todas as folhas tˆem a
mesma profundidade e todos os n´os internos tˆem 2 filhos
1
2 3
4 5 6 7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
8. Heaps
Visualiza¸c˜ao
Para entender o heap, considere uma uma ´arvore
bin´aria completa
Ou seja, a ´arvore bin´aria em que todas as folhas tˆem a
mesma profundidade e todos os n´os internos tˆem 2 filhos
1
2 3
4 5 6 7
raiz
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
9. Heaps
Visualiza¸c˜ao
Para entender o heap, considere uma uma ´arvore
bin´aria completa
Ou seja, a ´arvore bin´aria em que todas as folhas tˆem a
mesma profundidade e todos os n´os internos tˆem 2 filhos
1
2 3
4 5 6 7
folhas
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
10. Heaps
Visualiza¸c˜ao
Para entender o heap, considere uma uma ´arvore
bin´aria completa
Ou seja, a ´arvore bin´aria em que todas as folhas tˆem a
mesma profundidade e todos os n´os internos tˆem 2 filhos
1
2 3
4 5 6 7
Profundidade de
um n´o: distˆancia
do n´o `a raiz, em
n´umero de arestas
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
11. Heaps
Visualiza¸c˜ao
Para entender o heap, considere uma uma ´arvore
bin´aria completa
Ou seja, a ´arvore bin´aria em que todas as folhas tˆem a
mesma profundidade e todos os n´os internos tˆem 2 filhos
1
2 3
4 5 6 7
Altura de um n´o:
distˆancia descendente
(em arestas) do
maior caminho entre
esse n´o e uma folha
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
12. Heaps
Visualiza¸c˜ao
Para entender o heap, considere uma uma ´arvore
bin´aria completa
Ou seja, a ´arvore bin´aria em que todas as folhas tˆem a
mesma profundidade e todos os n´os internos tˆem 2 filhos
1
2 3
4 5 6 7
A altura da ´arvore ser´a
a altura de sua raiz
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
14. Heaps
Visualiza¸c˜ao
Relaxemos agora para uma ´arvore bin´aria quase
completa
Ou seja, uma ´arvore bin´aria completa, com poss´ıvel exce¸c˜ao
do n´ıvel mais baixo, que ´e preenchido da esquerda at´e um
certo ponto
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 5 / 27
15. Heaps
Visualiza¸c˜ao
Relaxemos agora para uma ´arvore bin´aria quase
completa
Ou seja, uma ´arvore bin´aria completa, com poss´ıvel exce¸c˜ao
do n´ıvel mais baixo, que ´e preenchido da esquerda at´e um
certo ponto
1
2 3
4 5 6
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 5 / 27
16. Heaps
Visualiza¸c˜ao
Note que, se seguirmos
essa ordem de cria¸c˜ao da
´arvore (1 a n) e o ´ultimo
n´ıvel da ´arvore n˜ao estiver
cheio, ent˜ao as folhas
aparecer˜ao em 2 n´ıveis
adjacentes
1
2 3
4 5
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 6 / 27
17. Heaps
Visualiza¸c˜ao
Note que, se seguirmos
essa ordem de cria¸c˜ao da
´arvore (1 a n) e o ´ultimo
n´ıvel da ´arvore n˜ao estiver
cheio, ent˜ao as folhas
aparecer˜ao em 2 n´ıveis
adjacentes
1
2 3
4 5
Com as mais baixas `a esquerda
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 6 / 27
19. Heaps
Visualiza¸c˜ao
Tamb´em note que:
O n´o k/2 ´e pai do n´o k,
1 < k ≤ n
1
2 3
4 5 6
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 7 / 27
20. Heaps
Visualiza¸c˜ao
Tamb´em note que:
O n´o k/2 ´e pai do n´o k,
1 < k ≤ n
Os n´os 2k e 2k + 1 s˜ao os
filhos `a esquerda e `a
direita do n´o k,
1 ≤ k ≤ n/2
1
2 3
4 5 6
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 7 / 27
21. Heaps
Visualiza¸c˜ao
Tamb´em note que:
O n´o k/2 ´e pai do n´o k,
1 < k ≤ n
Os n´os 2k e 2k + 1 s˜ao os
filhos `a esquerda e `a
direita do n´o k,
1 ≤ k ≤ n/2
1
2 3
4 5 6
E que rela¸c˜ao isso tem com os valores permitidos
em um heap?
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 7 / 27
23. Heaps
Visualiza¸c˜ao: Heap M´aximo
S[i] ≥ S[2i]
S[i] ≥ S[2i + 1]
i = 1, 2, . . . , n/2
1
2 3
4 5 6 7
Os n´os com valores 2i e 2i + 1 ser˜ao os filhos `a esquerda e `a
direita do n´o com valor i
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 8 / 27
24. Heaps
Visualiza¸c˜ao: Heap M´aximo
S[i] ≥ S[2i]
S[i] ≥ S[2i + 1]
i = 1, 2, . . . , n/2
1
2 3
4 5 6 7
Os n´os com valores 2i e 2i + 1 ser˜ao os filhos `a esquerda e `a
direita do n´o com valor i
Montando a ´arvore dessa maneira, em que o valor de cada
n´o ´e maior ou igual ao valor dos filhos, ela satisfar´a a
condi¸c˜ao do heap m´aximo
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 8 / 27
25. Heaps
Visualiza¸c˜ao: Heap M´aximo
S[i] ≥ S[2i]
S[i] ≥ S[2i + 1]
i = 1, 2, . . . , n/2
S1
R2 O3
E4 N5 A6 D7
Os n´os com valores 2i e 2i + 1 ser˜ao os filhos `a esquerda e `a
direita do n´o com valor i
Montando a ´arvore dessa maneira, em que o valor de cada
n´o ´e maior ou igual ao valor dos filhos, ela satisfar´a a
condi¸c˜ao do heap m´aximo
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 8 / 27
26. Heaps
Visualiza¸c˜ao: Heap M´ınimo
Para o heap m´ınimo, basta fazermos com que o
valor de cada n´o seja menor ou igual ao de seus
filhos
S[i] ≤ S[2i]
S[i] ≤ S[2i + 1]
i = 1, 2, . . . , n/2
1
2 3
4 5 6 7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 9 / 27
27. Heaps
Visualiza¸c˜ao: Heap M´ınimo
Para o heap m´ınimo, basta fazermos com que o
valor de cada n´o seja menor ou igual ao de seus
filhos
S[i] ≤ S[2i]
S[i] ≤ S[2i + 1]
i = 1, 2, . . . , n/2
A1
D2 E3
N4 O5 R6 S7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 9 / 27
28. Heaps M´aximo e M´ınimo
Propriedade dos Heaps
A representa¸c˜ao usando uma ´arvore nos permite
redefinir a propriedade dos heaps:
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 10 / 27
29. Heaps M´aximo e M´ınimo
Propriedade dos Heaps
A representa¸c˜ao usando uma ´arvore nos permite
redefinir a propriedade dos heaps:
Heap M´aximo:
Aquele em que, para todo n´o i diferente da raiz,
S[pai(i)] ≥ S[i]
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 10 / 27
30. Heaps M´aximo e M´ınimo
Propriedade dos Heaps
A representa¸c˜ao usando uma ´arvore nos permite
redefinir a propriedade dos heaps:
Heap M´aximo:
Aquele em que, para todo n´o i diferente da raiz,
S[pai(i)] ≥ S[i]
Heap M´ınimo:
Aquele em que, para todo n´o i diferente da raiz,
S[pai(i)] ≤ S[i]
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 10 / 27
32. Heaps
Representa¸c˜ao
E como representamos
essa ´arvore
computacionalmente?
S1
R2 O3
E4 N5 A6 D7
Com um arranjo
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 11 / 27
33. Heaps
Representa¸c˜ao
E como representamos
essa ´arvore
computacionalmente?
S1
R2 O3
E4 N5 A6 D7
Com um arranjo
S R O E N A D
1 2 3 4 5 6 7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 11 / 27
34. Heaps
Representa¸c˜ao
E como representamos
essa ´arvore
computacionalmente?
S1
R2 O3
E4 N5 A6 D7
Com um arranjo
Os filhos do n´o i ficar˜ao
nas posi¸c˜oes 2i e 2i + 1,
caso existam
S R O E N A D
1 2 3 4 5 6 7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 11 / 27
35. Heaps
Representa¸c˜ao
E como representamos
essa ´arvore
computacionalmente?
S1
R2 O3
E4 N5 A6 D7
Com um arranjo
Os filhos do n´o i ficar˜ao
nas posi¸c˜oes 2i e 2i + 1,
caso existam
O pai de um n´o i estar´a
na posi¸c˜ao i/2
S R O E N A D
1 2 3 4 5 6 7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 11 / 27
36. Heaps
Representa¸c˜ao
Mas, em muitas linguagens o arranjo come¸ca em 0
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 12 / 27
37. Heaps
Representa¸c˜ao
Mas, em muitas linguagens o arranjo come¸ca em 0
Sem problemas, basta adaptar
S R O E N A D
0 1 2 3 4 5 6
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 12 / 27
38. Heaps
Representa¸c˜ao
Mas, em muitas linguagens o arranjo come¸ca em 0
Sem problemas, basta adaptar
Os filhos do n´o i ficar˜ao
nas posi¸c˜oes 2i + 1 e
2i + 2, caso existam
S R O E N A D
0 1 2 3 4 5 6
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 12 / 27
39. Heaps
Representa¸c˜ao
Mas, em muitas linguagens o arranjo come¸ca em 0
Sem problemas, basta adaptar
Os filhos do n´o i ficar˜ao
nas posi¸c˜oes 2i + 1 e
2i + 2, caso existam
O pai de um n´o i estar´a
na posi¸c˜ao (i − 1)/2
S R O E N A D
0 1 2 3 4 5 6
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 12 / 27
40. Heaps
Representa¸c˜ao
Um heap ´e ent˜ao uma
´arvore bin´aria quase
completa na qual cada
n´o satisfaz a condi¸c˜ao
do heap
S1
R2 O3
E4 N5 A6 D7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 13 / 27
41. Heaps
Representa¸c˜ao
Um heap ´e ent˜ao uma
´arvore bin´aria quase
completa na qual cada
n´o satisfaz a condi¸c˜ao
do heap
S1
R2 O3
E4 N5 A6 D7
No caso do heap
m´aximo, a maior chave
estar´a sempre na
primeira posi¸c˜ao
S R O E N A D
1 2 3 4 5 6 7
(heap m´aximo)
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 13 / 27
42. Heaps
Representa¸c˜ao
J´a no heap m´ınimo, a
menor chave ´e que
estar´a sempre na
primeira posi¸c˜ao
A1
D2 E3
N4 O5 R6 S7
A D E N O R S
1 2 3 4 5 6 7
(heap m´ınimo)
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 14 / 27
43. Heaps
Opera¸c˜oes no Heap
Algoritmos que operam sobre o heap o fazem ao
longo de algum caminho na ´arvore
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 15 / 27
44. Heaps
Opera¸c˜oes no Heap
Algoritmos que operam sobre o heap o fazem ao
longo de algum caminho na ´arvore
A partir da raiz at´e uma folha
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 15 / 27
45. Heaps
Opera¸c˜oes no Heap
Algoritmos que operam sobre o heap o fazem ao
longo de algum caminho na ´arvore
A partir da raiz at´e uma folha
S1
R2 O3
E4 N5 A6 D7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 15 / 27
46. Heaps
Opera¸c˜oes no Heap
Algoritmos que operam sobre o heap o fazem ao
longo de algum caminho na ´arvore
A partir da raiz at´e uma folha
S1
R2 O3
E4 N5 A6 D7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 15 / 27
47. Heaps
Opera¸c˜oes no Heap
Algoritmos que operam sobre o heap o fazem ao
longo de algum caminho na ´arvore
A partir da raiz at´e uma folha
S1
R2 O3
E4 N5 A6 D7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 15 / 27
48. Heaps
Opera¸c˜oes no Heap
Algoritmos que operam sobre o heap o fazem ao
longo de algum caminho na ´arvore
A partir da raiz at´e uma folha
S1
R2 O3
E4 N5 A6 D7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 15 / 27
49. Heaps
Opera¸c˜oes no Heap
Algoritmos que operam sobre o heap o fazem ao
longo de algum caminho na ´arvore
A partir da raiz at´e uma folha
S1
R2 O3
E4 N5 A6 D7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 15 / 27
50. Heaps
Opera¸c˜oes no Heap
Algoritmos que operam sobre o heap o fazem ao
longo de algum caminho na ´arvore
A partir da raiz at´e uma folha
S1
R2 O3
E4 N5 A6 D7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 15 / 27
51. Heaps
Mantendo a Propriedade do Heap
Imagine que temos o
seguinte heap m´aximo 16
1
15
2
10
3
14
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 16 / 27
52. Heaps
Mantendo a Propriedade do Heap
Imagine que temos o
seguinte heap m´aximo
Imagine agora que
houve uma altera¸c˜ao
que pode violar a
propriedade do heap
16
1
4
2
10
3
14
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 16 / 27
53. Heaps
Mantendo a Propriedade do Heap
Imagine que temos o
seguinte heap m´aximo
Imagine agora que
houve uma altera¸c˜ao
que pode violar a
propriedade do heap
Pode deixar valor do pai
menor que o dos filhos
16
1
4
2
10
3
14
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 16 / 27
54. Heaps
Mantendo a Propriedade do Heap
Imagine que temos o
seguinte heap m´aximo
Imagine agora que
houve uma altera¸c˜ao
que pode violar a
propriedade do heap
Pode deixar valor do pai
menor que o dos filhos
16
1
4
2
10
3
14
4
7
5
9
6
3
7
2
8
8
9
1
10
Como restaurar essa propriedade?
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 16 / 27
55. Heaps
Mantendo a Propriedade do Heap
Antes de mais nada,
verificamos no heap
onde houve essa
viola¸c˜ao
16
1
4
2
10
3
14
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 17 / 27
56. Heaps
Mantendo a Propriedade do Heap
Antes de mais nada,
verificamos no heap
onde houve essa
viola¸c˜ao
Ou ela acontece no pai do
n´o alterado
16
1
4
2
10
3
14
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 17 / 27
57. Heaps
Mantendo a Propriedade do Heap
Antes de mais nada,
verificamos no heap
onde houve essa
viola¸c˜ao
Ou ela acontece no pai do
n´o alterado – est´a ok
16
1
4
2
10
3
14
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 17 / 27
58. Heaps
Mantendo a Propriedade do Heap
Antes de mais nada,
verificamos no heap
onde houve essa
viola¸c˜ao
Ou ela acontece no pai do
n´o alterado – est´a ok
Ou no pr´oprio n´o
16
1
4
2
10
3
14
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 17 / 27
59. Heaps
Mantendo a Propriedade do Heap
Antes de mais nada,
verificamos no heap
onde houve essa
viola¸c˜ao
Ou ela acontece no pai do
n´o alterado – est´a ok
Ou no pr´oprio n´o –
falhou aqui
16
1
4
2
10
3
14
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 17 / 27
60. Heaps
Mantendo a Propriedade do Heap
Feito isso, trocamos o
elemento problem´atico
de lugar com o maior
filho
16
1
4
2
10
3
14
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 18 / 27
61. Heaps
Mantendo a Propriedade do Heap
Feito isso, trocamos o
elemento problem´atico
de lugar com o maior
filho
16
1
14
2
10
3
4
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 18 / 27
62. Heaps
Mantendo a Propriedade do Heap
Feito isso, trocamos o
elemento problem´atico
de lugar com o maior
filho
Note que isso n˜ao viola a
propriedade do heap
16
1
14
2
10
3
4
4
7
5
9
6
3
7
2
8
8
9
1
10
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 18 / 27
63. Heaps
Mantendo a Propriedade do Heap
Feito isso, trocamos o
elemento problem´atico
de lugar com o maior
filho
Note que isso n˜ao viola a
propriedade do heap
16
1
14
2
10
3
4
4
7
5
9
6
3
7
2
8
8
9
1
10
E repetimos o procedimento enquanto houver
viola¸c˜ao da propriedade
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 18 / 27
64. Heaps
Mantendo a Propriedade do Heap
Feito isso, trocamos o
elemento problem´atico
de lugar com o maior
filho
Note que isso n˜ao viola a
propriedade do heap
16
1
14
2
10
3
8
4
7
5
9
6
3
7
2
8
4
9
1
10
E repetimos o procedimento enquanto houver
viola¸c˜ao da propriedade
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 18 / 27
65. Heaps
Mantendo a Propriedade do Heap
Feito isso, trocamos o
elemento problem´atico
de lugar com o maior
filho
Note que isso n˜ao viola a
propriedade do heap
16
1
14
2
10
3
8
4
7
5
9
6
3
7
2
8
4
9
1
10
E repetimos o procedimento enquanto houver
viola¸c˜ao da propriedade
Empurramos assim o elemento problem´atico para baixo no
heap, at´e seu devido lugar
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 18 / 27
66. Heaps
Mantendo a Propriedade do Heap (M´aximo)
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i])) maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior])) maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 19 / 27
67. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Arranjo representando o heap
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i])) maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior])) maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 19 / 27
68. Heaps
Mantendo a Propriedade do Heap (M´aximo)
´Indice do elemento poten-
cialmente problem´atico
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i])) maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior])) maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 19 / 27
69. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Tamanho do heap (arranjo)
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i])) maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior])) maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 19 / 27
70. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Retorna o ´ındice no arranjo
da sub´arvore `a esquerda de i
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i])) maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior])) maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 19 / 27
71. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Retorna o ´ındice no arranjo
da sub´arvore `a direita de i
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i])) maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior])) maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 19 / 27
72. Heaps
Mantendo a Propriedade do Heap (M´aximo)
refazHeapMax assume
que essas sub´arvores
correspondem a heaps
m´aximos, e que A[i] pode
ser menor que seus filhos
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i])) maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior])) maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 19 / 27
73. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Vˆe se o filho `a es-
querda existe, e se ´e
maior que seu pai i
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i])) maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior])) maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 19 / 27
74. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Vˆe se o filho `a direita
existe, e se ´e maior
que seu pai ou irm˜ao
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i])) maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior])) maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 19 / 27
75. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Troca i de lugar com o
filho maior que ele, se houver
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i])) maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior])) maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 19 / 27
76. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Vˆe se essa troca n˜ao
gerou nova viola¸c˜ao do
heap nessa sub´arvore
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i])) maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior])) maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 19 / 27
77. Heaps
Mantendo a Propriedade do Heap (M´aximo)
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
78. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
4
1
10
2
14
3
7
4
9
5
3
6
2
7
8
8
1
9
16 4 10 14 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i1
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
79. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
4
1
10
2
14
3
7
4
9
5
3
6
2
7
8
8
1
9
16 4 10 14 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i1
esq1
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
80. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
4
1
10
2
14
3
7
4
9
5
3
6
2
7
8
8
1
9
16 4 10 14 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i1
esq1 dir1
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
81. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
4
1
10
2
14
3
7
4
9
5
3
6
2
7
8
8
1
9
16 4 10 14 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i1
esq1 dir1
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
82. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
4
1
10
2
14
3
7
4
9
5
3
6
2
7
8
8
1
9
16 4 10 14 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i1
esq1 dir1
maior1
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
83. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
4
1
10
2
14
3
7
4
9
5
3
6
2
7
8
8
1
9
16 4 10 14 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i1
esq1 dir1
maior1
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
84. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
4
1
10
2
14
3
7
4
9
5
3
6
2
7
8
8
1
9
16 4 10 14 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i1
esq1 dir1
maior1
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
85. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
4
3
7
4
9
5
3
6
2
7
8
8
1
9
16 14 10 4 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i1
esq1 dir1
maior1
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
86. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
4
3
7
4
9
5
3
6
2
7
8
8
1
9
16 14 10 4 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i2
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
87. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
4
3
7
4
9
5
3
6
2
7
8
8
1
9
16 14 10 4 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i2
esq2
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
88. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
4
3
7
4
9
5
3
6
2
7
8
8
1
9
16 14 10 4 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i2
esq2 dir2
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
89. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
4
3
7
4
9
5
3
6
2
7
8
8
1
9
16 14 10 4 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i2
esq2 dir2
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
90. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
4
3
7
4
9
5
3
6
2
7
8
8
1
9
16 14 10 4 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i2
esq2 dir2
maior2
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
91. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
4
3
7
4
9
5
3
6
2
7
8
8
1
9
16 14 10 4 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i2
esq2 dir2
maior2
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
92. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
4
3
7
4
9
5
3
6
2
7
8
8
1
9
16 14 10 4 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i2
esq2 dir2
maior2
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
93. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
4
3
7
4
9
5
3
6
2
7
8
8
1
9
16 14 10 4 7 9 3 2 8 1
0 1 2 3 4 5 6 7 8 9
i2
esq2 dir2
maior2
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
94. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
16 14 10 8 7 9 3 2 4 1
0 1 2 3 4 5 6 7 8 9
i2
esq2 dir2
maior2
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
95. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
16 14 10 8 7 9 3 2 4 1
0 1 2 3 4 5 6 7 8 9
i3
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
96. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
16 14 10 8 7 9 3 2 4 1
0 1 2 3 4 5 6 7 8 9
i3
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
97. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
16 14 10 8 7 9 3 2 4 1
0 1 2 3 4 5 6 7 8 9
i3
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
98. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
16 14 10 8 7 9 3 2 4 1
0 1 2 3 4 5 6 7 8 9
i3
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
99. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
16 14 10 8 7 9 3 2 4 1
0 1 2 3 4 5 6 7 8 9
i3
maior3
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
100. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
16 14 10 8 7 9 3 2 4 1
0 1 2 3 4 5 6 7 8 9
i3
maior3
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
101. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
16 14 10 8 7 9 3 2 4 1
0 1 2 3 4 5 6 7 8 9
i3
maior3
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
102. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
16 14 10 8 7 9 3 2 4 1
0 1 2 3 4 5 6 7 8 9
i3
maior3
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 20 / 27
103. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Em nosso algoritmo, usamos esquerda(i) e
direita(i)
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 21 / 27
104. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Em nosso algoritmo, usamos esquerda(i) e
direita(i)
Como implement´a-las?
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 21 / 27
105. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Em nosso algoritmo, usamos esquerda(i) e
direita(i)
Como implement´a-las?
int esquerda(int i) {
return(2*i+1);
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 21 / 27
106. Heaps
Mantendo a Propriedade do Heap (M´aximo)
Em nosso algoritmo, usamos esquerda(i) e
direita(i)
Como implement´a-las?
int esquerda(int i) {
return(2*i+1);
}
int direita(int i) {
return(2*i+2);
}
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 21 / 27
107. Heaps
Mantendo a Propriedade do Heap (M´aximo)
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
E por que passar o
tamanho por parˆametro
em vez de usar
A.length?
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 22 / 27
108. Heaps
Mantendo a Propriedade do Heap (M´aximo)
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
E por que passar o
tamanho por parˆametro
em vez de usar
A.length?
Na pr´oxima aula
veremos...
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 22 / 27
109. Heaps
Mantendo a Propriedade do Heap (M´aximo)
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
E qual a complexidade
do refazHeapMax?
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 23 / 27
110. Heaps
Mantendo a Propriedade do Heap (M´aximo)
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
E qual a complexidade
do refazHeapMax?
Θ(1)
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 23 / 27
111. Heaps
Mantendo a Propriedade do Heap (M´aximo)
void refazHeapMax(int A[], int i, int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
E qual a complexidade
do refazHeapMax?
Θ(1)
T(???)
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 23 / 27
112. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
Note que abaixo de
cada n´o h´a uma
sub´arvore de, no
m´aximo, 2n/3 n´os
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 24 / 27
113. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
Note que abaixo de
cada n´o h´a uma
sub´arvore de, no
m´aximo, 2n/3 n´os
O pior caso sendo quando
a ´ultima camada est´a
metade cheia
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 24 / 27
114. Heaps
Mantendo a Propriedade do Heap (M´aximo)
16
0
14
1
10
2
8
3
7
4
9
5
3
6
2
7
4
8
1
9
Note que abaixo de
cada n´o h´a uma
sub´arvore de, no
m´aximo, 2n/3 n´os
O pior caso sendo quando
a ´ultima camada est´a
metade cheia
Caso em que uma
sub´arvore ter´a 1/3 e a
outra 2/3 dos n´os
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 24 / 27
115. Heaps
Mantendo a Propriedade do Heap (M´aximo)
void refazHeapMax(int A[], int i,
int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Ent˜ao, temos que a
chamada recursiva ´e
T(2n/3)
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 25 / 27
116. Heaps
Mantendo a Propriedade do Heap (M´aximo)
void refazHeapMax(int A[], int i,
int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Ent˜ao, temos que a
chamada recursiva ´e
T(2n/3)
E a rela¸c˜ao de recorrˆencia
fica
T(n) = T(2n/3) + Θ(1)
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 25 / 27
117. Heaps
Mantendo a Propriedade do Heap (M´aximo)
void refazHeapMax(int A[], int i,
int compHeap) {
int esq, dir, maior, temp;
esq = esquerda(i);
dir = direita(i);
if((esq<compHeap) && (A[esq]>A[i]))
maior = esq;
else maior = i;
if((dir<compHeap) && (A[dir]>A[maior]))
maior = dir;
if(maior != i) {
temp = A[i];
A[i] = A[maior];
A[maior] = temp;
refazHeapMax(A, maior, compHeap);
}
}
Ent˜ao, temos que a
chamada recursiva ´e
T(2n/3)
E a rela¸c˜ao de recorrˆencia
fica
T(n) = T(2n/3) + Θ(1)
Que, pelo Teorema
Mestre (caso 2), tem
solu¸c˜ao T(n) = O(log n)
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 25 / 27
118. Heaps
Construindo um Heap (M´aximo)
Vimos ent˜ao como representar um heap
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 26 / 27
119. Heaps
Construindo um Heap (M´aximo)
Vimos ent˜ao como representar um heap
Tamb´em vimos como manter a propriedade do
heap, quando alguma altera¸c˜ao ´e feita nele
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 26 / 27
120. Heaps
Construindo um Heap (M´aximo)
Vimos ent˜ao como representar um heap
Tamb´em vimos como manter a propriedade do
heap, quando alguma altera¸c˜ao ´e feita nele
E como fazemos para construir um heap?
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 26 / 27
121. Heaps
Construindo um Heap (M´aximo)
Vimos ent˜ao como representar um heap
Tamb´em vimos como manter a propriedade do
heap, quando alguma altera¸c˜ao ´e feita nele
E como fazemos para construir um heap?
Na pr´oxima aula...
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 26 / 27
122. Referˆencias
Ziviani, Nivio. Projeto de Algoritmos: com implementa¸c˜oes
em Java e C++. Cengage. 2007.
Cormen, Thomas H., Leiserson, Charles E., Rivest, Ronald L.,
Stein, Clifford. Introduction to Algorithms. 2a ed. MIT Press,
2001.
Slides dos professores Delano Beder e Marcos Chain
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 27 / 27