SlideShare uma empresa Scribd logo
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
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
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
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
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
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
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
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
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
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
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
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
Heaps
Visualiza¸c˜ao
Relaxemos agora para uma ´arvore bin´aria quase
completa
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 5 / 27
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
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
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
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
Heaps
Visualiza¸c˜ao
Tamb´em note que:
1
2 3
4 5 6
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 7 / 27
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
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
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
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
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 8 / 27
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
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
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
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
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
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
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
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
Heaps
Representa¸c˜ao
E como representamos
essa ´arvore
computacionalmente?
S1
R2 O3
E4 N5 A6 D7
Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 11 / 27
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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

Mais conteúdo relacionado

Mais de Norton Trevisan Roman

(ACH2044) Inteligência Artificial - Aula 24
(ACH2044) Inteligência Artificial - Aula 24(ACH2044) Inteligência Artificial - Aula 24
(ACH2044) Inteligência Artificial - Aula 24
Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 23
(ACH2044) Inteligência Artificial - Aula 23(ACH2044) Inteligência Artificial - Aula 23
(ACH2044) Inteligência Artificial - Aula 23
Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 22
(ACH2044) Inteligência Artificial - Aula 22(ACH2044) Inteligência Artificial - Aula 22
(ACH2044) Inteligência Artificial - Aula 22
Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 21
(ACH2044) Inteligência Artificial - Aula 21(ACH2044) Inteligência Artificial - Aula 21
(ACH2044) Inteligência Artificial - Aula 21
Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 20
(ACH2044) Inteligência Artificial - Aula 20(ACH2044) Inteligência Artificial - Aula 20
(ACH2044) Inteligência Artificial - Aula 20
Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 19
(ACH2044) Inteligência Artificial - Aula 19(ACH2044) Inteligência Artificial - Aula 19
(ACH2044) Inteligência Artificial - Aula 19
Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 18
(ACH2044) Inteligência Artificial - Aula 18(ACH2044) Inteligência Artificial - Aula 18
(ACH2044) Inteligência Artificial - Aula 18
Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 17
(ACH2044) Inteligência Artificial - Aula 17(ACH2044) Inteligência Artificial - Aula 17
(ACH2044) Inteligência Artificial - Aula 17
Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 16
(ACH2044) Inteligência Artificial - Aula 16(ACH2044) Inteligência Artificial - Aula 16
(ACH2044) Inteligência Artificial - Aula 16
Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 15
(ACH2044) Inteligência Artificial - Aula 15(ACH2044) Inteligência Artificial - Aula 15
(ACH2044) Inteligência Artificial - Aula 15
Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 14
(ACH2044) Inteligência Artificial - Aula 14(ACH2044) Inteligência Artificial - Aula 14
(ACH2044) Inteligência Artificial - Aula 14
Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 13
(ACH2044) Inteligência Artificial - Aula 13(ACH2044) Inteligência Artificial - Aula 13
(ACH2044) Inteligência Artificial - Aula 13
Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 12
(ACH2044) Inteligência Artificial - Aula 12(ACH2044) Inteligência Artificial - Aula 12
(ACH2044) Inteligência Artificial - Aula 12
Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 11
(ACH2044) Inteligência Artificial - Aula 11(ACH2044) Inteligência Artificial - Aula 11
(ACH2044) Inteligência Artificial - Aula 11
Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 10
(ACH2044) Inteligência Artificial - Aula 10(ACH2044) Inteligência Artificial - Aula 10
(ACH2044) Inteligência Artificial - Aula 10
Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 09
(ACH2044) Inteligência Artificial - Aula 09(ACH2044) Inteligência Artificial - Aula 09
(ACH2044) Inteligência Artificial - Aula 09
Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 08
(ACH2044) Inteligência Artificial - Aula 08(ACH2044) Inteligência Artificial - Aula 08
(ACH2044) Inteligência Artificial - Aula 08
Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 07
(ACH2044) Inteligência Artificial - Aula 07(ACH2044) Inteligência Artificial - Aula 07
(ACH2044) Inteligência Artificial - Aula 07
Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 06
(ACH2044) Inteligência Artificial - Aula 06(ACH2044) Inteligência Artificial - Aula 06
(ACH2044) Inteligência Artificial - Aula 06
Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 05
(ACH2044) Inteligência Artificial - Aula 05(ACH2044) Inteligência Artificial - Aula 05
(ACH2044) Inteligência Artificial - Aula 05
Norton Trevisan Roman
 

Mais de Norton Trevisan Roman (20)

(ACH2044) Inteligência Artificial - Aula 24
(ACH2044) Inteligência Artificial - Aula 24(ACH2044) Inteligência Artificial - Aula 24
(ACH2044) Inteligência Artificial - Aula 24
 
(ACH2044) Inteligência Artificial - Aula 23
(ACH2044) Inteligência Artificial - Aula 23(ACH2044) Inteligência Artificial - Aula 23
(ACH2044) Inteligência Artificial - Aula 23
 
(ACH2044) Inteligência Artificial - Aula 22
(ACH2044) Inteligência Artificial - Aula 22(ACH2044) Inteligência Artificial - Aula 22
(ACH2044) Inteligência Artificial - Aula 22
 
(ACH2044) Inteligência Artificial - Aula 21
(ACH2044) Inteligência Artificial - Aula 21(ACH2044) Inteligência Artificial - Aula 21
(ACH2044) Inteligência Artificial - Aula 21
 
(ACH2044) Inteligência Artificial - Aula 20
(ACH2044) Inteligência Artificial - Aula 20(ACH2044) Inteligência Artificial - Aula 20
(ACH2044) Inteligência Artificial - Aula 20
 
(ACH2044) Inteligência Artificial - Aula 19
(ACH2044) Inteligência Artificial - Aula 19(ACH2044) Inteligência Artificial - Aula 19
(ACH2044) Inteligência Artificial - Aula 19
 
(ACH2044) Inteligência Artificial - Aula 18
(ACH2044) Inteligência Artificial - Aula 18(ACH2044) Inteligência Artificial - Aula 18
(ACH2044) Inteligência Artificial - Aula 18
 
(ACH2044) Inteligência Artificial - Aula 17
(ACH2044) Inteligência Artificial - Aula 17(ACH2044) Inteligência Artificial - Aula 17
(ACH2044) Inteligência Artificial - Aula 17
 
(ACH2044) Inteligência Artificial - Aula 16
(ACH2044) Inteligência Artificial - Aula 16(ACH2044) Inteligência Artificial - Aula 16
(ACH2044) Inteligência Artificial - Aula 16
 
(ACH2044) Inteligência Artificial - Aula 15
(ACH2044) Inteligência Artificial - Aula 15(ACH2044) Inteligência Artificial - Aula 15
(ACH2044) Inteligência Artificial - Aula 15
 
(ACH2044) Inteligência Artificial - Aula 14
(ACH2044) Inteligência Artificial - Aula 14(ACH2044) Inteligência Artificial - Aula 14
(ACH2044) Inteligência Artificial - Aula 14
 
(ACH2044) Inteligência Artificial - Aula 13
(ACH2044) Inteligência Artificial - Aula 13(ACH2044) Inteligência Artificial - Aula 13
(ACH2044) Inteligência Artificial - Aula 13
 
(ACH2044) Inteligência Artificial - Aula 12
(ACH2044) Inteligência Artificial - Aula 12(ACH2044) Inteligência Artificial - Aula 12
(ACH2044) Inteligência Artificial - Aula 12
 
(ACH2044) Inteligência Artificial - Aula 11
(ACH2044) Inteligência Artificial - Aula 11(ACH2044) Inteligência Artificial - Aula 11
(ACH2044) Inteligência Artificial - Aula 11
 
(ACH2044) Inteligência Artificial - Aula 10
(ACH2044) Inteligência Artificial - Aula 10(ACH2044) Inteligência Artificial - Aula 10
(ACH2044) Inteligência Artificial - Aula 10
 
(ACH2044) Inteligência Artificial - Aula 09
(ACH2044) Inteligência Artificial - Aula 09(ACH2044) Inteligência Artificial - Aula 09
(ACH2044) Inteligência Artificial - Aula 09
 
(ACH2044) Inteligência Artificial - Aula 08
(ACH2044) Inteligência Artificial - Aula 08(ACH2044) Inteligência Artificial - Aula 08
(ACH2044) Inteligência Artificial - Aula 08
 
(ACH2044) Inteligência Artificial - Aula 07
(ACH2044) Inteligência Artificial - Aula 07(ACH2044) Inteligência Artificial - Aula 07
(ACH2044) Inteligência Artificial - Aula 07
 
(ACH2044) Inteligência Artificial - Aula 06
(ACH2044) Inteligência Artificial - Aula 06(ACH2044) Inteligência Artificial - Aula 06
(ACH2044) Inteligência Artificial - Aula 06
 
(ACH2044) Inteligência Artificial - Aula 05
(ACH2044) Inteligência Artificial - Aula 05(ACH2044) Inteligência Artificial - Aula 05
(ACH2044) Inteligência Artificial - Aula 05
 

Último

Famílias Que Contribuíram Para O Crescimento Do Assaré
Famílias Que Contribuíram Para O Crescimento Do AssaréFamílias Que Contribuíram Para O Crescimento Do Assaré
Famílias Que Contribuíram Para O Crescimento Do Assaré
profesfrancleite
 
karl marx biografia resumida com suas obras e história de vida
karl marx biografia resumida com suas obras e história de vidakarl marx biografia resumida com suas obras e história de vida
karl marx biografia resumida com suas obras e história de vida
KleginaldoPaz2
 
UFCD_10949_Lojas e-commerce no-code_índice.pdf
UFCD_10949_Lojas e-commerce no-code_índice.pdfUFCD_10949_Lojas e-commerce no-code_índice.pdf
UFCD_10949_Lojas e-commerce no-code_índice.pdf
Manuais Formação
 
O Mito da Caverna de Platão_ Uma Jornada em Busca da Verdade.pdf
O Mito da Caverna de Platão_ Uma Jornada em Busca da Verdade.pdfO Mito da Caverna de Platão_ Uma Jornada em Busca da Verdade.pdf
O Mito da Caverna de Platão_ Uma Jornada em Busca da Verdade.pdf
silvamelosilva300
 
Estrutura Pedagógica - Laboratório de Educação a Distância.ppt
Estrutura Pedagógica - Laboratório de Educação a Distância.pptEstrutura Pedagógica - Laboratório de Educação a Distância.ppt
Estrutura Pedagógica - Laboratório de Educação a Distância.ppt
livrosjovert
 
Potenciação e Radiciação de Números Racionais
Potenciação e Radiciação de Números RacionaisPotenciação e Radiciação de Números Racionais
Potenciação e Radiciação de Números Racionais
wagnermorais28
 
Introdução à Sociologia: caça-palavras na escola
Introdução à Sociologia: caça-palavras na escolaIntrodução à Sociologia: caça-palavras na escola
Introdução à Sociologia: caça-palavras na escola
Professor Belinaso
 
A SOCIOLOGIA E O TRABALHO: ANÁLISES E VIVÊNCIAS
A SOCIOLOGIA E O TRABALHO: ANÁLISES E VIVÊNCIASA SOCIOLOGIA E O TRABALHO: ANÁLISES E VIVÊNCIAS
A SOCIOLOGIA E O TRABALHO: ANÁLISES E VIVÊNCIAS
HisrelBlog
 
1ª LEI DE OHN, CARACTERISTICAS IMPORTANTES.
1ª LEI DE OHN, CARACTERISTICAS IMPORTANTES.1ª LEI DE OHN, CARACTERISTICAS IMPORTANTES.
1ª LEI DE OHN, CARACTERISTICAS IMPORTANTES.
LeticiaRochaCupaiol
 
Testes + soluções_Mensagens12 )11111.pdf
Testes + soluções_Mensagens12 )11111.pdfTestes + soluções_Mensagens12 )11111.pdf
Testes + soluções_Mensagens12 )11111.pdf
lveiga112
 
Fernão Lopes. pptx
Fernão Lopes.                       pptxFernão Lopes.                       pptx
Fernão Lopes. pptx
TomasSousa7
 
GÊNERO TEXTUAL - POEMA.pptx
GÊNERO      TEXTUAL     -     POEMA.pptxGÊNERO      TEXTUAL     -     POEMA.pptx
GÊNERO TEXTUAL - POEMA.pptx
Marlene Cunhada
 
OS elementos de uma boa Redação para o ENEM.pdf
OS elementos de uma boa Redação para o ENEM.pdfOS elementos de uma boa Redação para o ENEM.pdf
OS elementos de uma boa Redação para o ENEM.pdf
AmiltonAparecido1
 
D20 - Descritores SAEB de Língua Portuguesa
D20 - Descritores SAEB de Língua PortuguesaD20 - Descritores SAEB de Língua Portuguesa
D20 - Descritores SAEB de Língua Portuguesa
eaiprofpolly
 
Rimas, Luís Vaz de Camões. pptx
Rimas, Luís Vaz de Camões.          pptxRimas, Luís Vaz de Camões.          pptx
Rimas, Luís Vaz de Camões. pptx
TomasSousa7
 
UFCD_10145_Enquadramento do setor farmacêutico_indice.pdf
UFCD_10145_Enquadramento do setor farmacêutico_indice.pdfUFCD_10145_Enquadramento do setor farmacêutico_indice.pdf
UFCD_10145_Enquadramento do setor farmacêutico_indice.pdf
Manuais Formação
 
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptxSlides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
LuizHenriquedeAlmeid6
 
Slides Lição 11, Central Gospel, Os Mortos Em CRISTO, 2Tr24.pptx
Slides Lição 11, Central Gospel, Os Mortos Em CRISTO, 2Tr24.pptxSlides Lição 11, Central Gospel, Os Mortos Em CRISTO, 2Tr24.pptx
Slides Lição 11, Central Gospel, Os Mortos Em CRISTO, 2Tr24.pptx
LuizHenriquedeAlmeid6
 
Reino-Vegetal plantas e demais conceitos .pptx
Reino-Vegetal plantas e demais conceitos .pptxReino-Vegetal plantas e demais conceitos .pptx
Reino-Vegetal plantas e demais conceitos .pptx
CarinaSantos916505
 
000. Para rezar o terço - Junho - mês do Sagrado Coração de Jesús.pdf
000. Para rezar o terço - Junho - mês do Sagrado Coração de Jesús.pdf000. Para rezar o terço - Junho - mês do Sagrado Coração de Jesús.pdf
000. Para rezar o terço - Junho - mês do Sagrado Coração de Jesús.pdf
YeniferGarcia36
 

Último (20)

Famílias Que Contribuíram Para O Crescimento Do Assaré
Famílias Que Contribuíram Para O Crescimento Do AssaréFamílias Que Contribuíram Para O Crescimento Do Assaré
Famílias Que Contribuíram Para O Crescimento Do Assaré
 
karl marx biografia resumida com suas obras e história de vida
karl marx biografia resumida com suas obras e história de vidakarl marx biografia resumida com suas obras e história de vida
karl marx biografia resumida com suas obras e história de vida
 
UFCD_10949_Lojas e-commerce no-code_índice.pdf
UFCD_10949_Lojas e-commerce no-code_índice.pdfUFCD_10949_Lojas e-commerce no-code_índice.pdf
UFCD_10949_Lojas e-commerce no-code_índice.pdf
 
O Mito da Caverna de Platão_ Uma Jornada em Busca da Verdade.pdf
O Mito da Caverna de Platão_ Uma Jornada em Busca da Verdade.pdfO Mito da Caverna de Platão_ Uma Jornada em Busca da Verdade.pdf
O Mito da Caverna de Platão_ Uma Jornada em Busca da Verdade.pdf
 
Estrutura Pedagógica - Laboratório de Educação a Distância.ppt
Estrutura Pedagógica - Laboratório de Educação a Distância.pptEstrutura Pedagógica - Laboratório de Educação a Distância.ppt
Estrutura Pedagógica - Laboratório de Educação a Distância.ppt
 
Potenciação e Radiciação de Números Racionais
Potenciação e Radiciação de Números RacionaisPotenciação e Radiciação de Números Racionais
Potenciação e Radiciação de Números Racionais
 
Introdução à Sociologia: caça-palavras na escola
Introdução à Sociologia: caça-palavras na escolaIntrodução à Sociologia: caça-palavras na escola
Introdução à Sociologia: caça-palavras na escola
 
A SOCIOLOGIA E O TRABALHO: ANÁLISES E VIVÊNCIAS
A SOCIOLOGIA E O TRABALHO: ANÁLISES E VIVÊNCIASA SOCIOLOGIA E O TRABALHO: ANÁLISES E VIVÊNCIAS
A SOCIOLOGIA E O TRABALHO: ANÁLISES E VIVÊNCIAS
 
1ª LEI DE OHN, CARACTERISTICAS IMPORTANTES.
1ª LEI DE OHN, CARACTERISTICAS IMPORTANTES.1ª LEI DE OHN, CARACTERISTICAS IMPORTANTES.
1ª LEI DE OHN, CARACTERISTICAS IMPORTANTES.
 
Testes + soluções_Mensagens12 )11111.pdf
Testes + soluções_Mensagens12 )11111.pdfTestes + soluções_Mensagens12 )11111.pdf
Testes + soluções_Mensagens12 )11111.pdf
 
Fernão Lopes. pptx
Fernão Lopes.                       pptxFernão Lopes.                       pptx
Fernão Lopes. pptx
 
GÊNERO TEXTUAL - POEMA.pptx
GÊNERO      TEXTUAL     -     POEMA.pptxGÊNERO      TEXTUAL     -     POEMA.pptx
GÊNERO TEXTUAL - POEMA.pptx
 
OS elementos de uma boa Redação para o ENEM.pdf
OS elementos de uma boa Redação para o ENEM.pdfOS elementos de uma boa Redação para o ENEM.pdf
OS elementos de uma boa Redação para o ENEM.pdf
 
D20 - Descritores SAEB de Língua Portuguesa
D20 - Descritores SAEB de Língua PortuguesaD20 - Descritores SAEB de Língua Portuguesa
D20 - Descritores SAEB de Língua Portuguesa
 
Rimas, Luís Vaz de Camões. pptx
Rimas, Luís Vaz de Camões.          pptxRimas, Luís Vaz de Camões.          pptx
Rimas, Luís Vaz de Camões. pptx
 
UFCD_10145_Enquadramento do setor farmacêutico_indice.pdf
UFCD_10145_Enquadramento do setor farmacêutico_indice.pdfUFCD_10145_Enquadramento do setor farmacêutico_indice.pdf
UFCD_10145_Enquadramento do setor farmacêutico_indice.pdf
 
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptxSlides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
 
Slides Lição 11, Central Gospel, Os Mortos Em CRISTO, 2Tr24.pptx
Slides Lição 11, Central Gospel, Os Mortos Em CRISTO, 2Tr24.pptxSlides Lição 11, Central Gospel, Os Mortos Em CRISTO, 2Tr24.pptx
Slides Lição 11, Central Gospel, Os Mortos Em CRISTO, 2Tr24.pptx
 
Reino-Vegetal plantas e demais conceitos .pptx
Reino-Vegetal plantas e demais conceitos .pptxReino-Vegetal plantas e demais conceitos .pptx
Reino-Vegetal plantas e demais conceitos .pptx
 
000. Para rezar o terço - Junho - mês do Sagrado Coração de Jesús.pdf
000. Para rezar o terço - Junho - mês do Sagrado Coração de Jesús.pdf000. Para rezar o terço - Junho - mês do Sagrado Coração de Jesús.pdf
000. Para rezar o terço - Junho - mês do Sagrado Coração de Jesús.pdf
 

(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
  • 13. Heaps Visualiza¸c˜ao Relaxemos agora para uma ´arvore bin´aria quase completa Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 5 / 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
  • 18. Heaps Visualiza¸c˜ao Tamb´em note que: 1 2 3 4 5 6 Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 7 / 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
  • 22. 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 Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 8 / 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
  • 31. Heaps Representa¸c˜ao E como representamos essa ´arvore computacionalmente? S1 R2 O3 E4 N5 A6 D7 Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 11 / 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