SlideShare uma empresa Scribd logo
1 de 122
Baixar para ler offline
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 24Norton 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 23Norton 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 22Norton 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 21Norton 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 20Norton 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 19Norton 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 18Norton 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 17Norton 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 16Norton 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 15Norton 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 14Norton 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 13Norton 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 12Norton 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 11Norton 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 10Norton 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 09Norton 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 08Norton 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 07Norton 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 06Norton 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 05Norton 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

Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdfReta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdfWagnerCamposCEA
 
Seminário Biologia e desenvolvimento da matrinxa.pptx
Seminário Biologia e desenvolvimento da matrinxa.pptxSeminário Biologia e desenvolvimento da matrinxa.pptx
Seminário Biologia e desenvolvimento da matrinxa.pptxReinaldoMuller1
 
Nós Propomos! Autocarros Elétricos - Trabalho desenvolvido no âmbito de Cidad...
Nós Propomos! Autocarros Elétricos - Trabalho desenvolvido no âmbito de Cidad...Nós Propomos! Autocarros Elétricos - Trabalho desenvolvido no âmbito de Cidad...
Nós Propomos! Autocarros Elétricos - Trabalho desenvolvido no âmbito de Cidad...Ilda Bicacro
 
PROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.pdf
PROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.pdfPROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.pdf
PROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.pdfHELENO FAVACHO
 
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdf
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdfApresentação ISBET Jovem Aprendiz e Estágio 2023.pdf
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdfcomercial400681
 
19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdfmarlene54545
 
Currículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdfCurrículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdfTutor de matemática Ícaro
 
PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...
PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...
PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...HELENO FAVACHO
 
Camadas da terra -Litosfera conteúdo 6º ano
Camadas da terra -Litosfera  conteúdo 6º anoCamadas da terra -Litosfera  conteúdo 6º ano
Camadas da terra -Litosfera conteúdo 6º anoRachel Facundo
 
Responde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptx
Responde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptxResponde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptx
Responde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptxAntonioVieira539017
 
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdfGEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdfRavenaSales1
 
PROJETO DE EXTENSÃO I - Radiologia Tecnologia
PROJETO DE EXTENSÃO I - Radiologia TecnologiaPROJETO DE EXTENSÃO I - Radiologia Tecnologia
PROJETO DE EXTENSÃO I - Radiologia TecnologiaHELENO FAVACHO
 
Atividade - Letra da música Esperando na Janela.
Atividade -  Letra da música Esperando na Janela.Atividade -  Letra da música Esperando na Janela.
Atividade - Letra da música Esperando na Janela.Mary Alvarenga
 
apostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médioapostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médiorosenilrucks
 
praticas experimentais 1 ano ensino médio
praticas experimentais 1 ano ensino médiopraticas experimentais 1 ano ensino médio
praticas experimentais 1 ano ensino médiorosenilrucks
 
Revolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividadesRevolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividadesFabianeMartins35
 
P P P 2024 - *CIEJA Santana / Tucuruvi*
P P P 2024  - *CIEJA Santana / Tucuruvi*P P P 2024  - *CIEJA Santana / Tucuruvi*
P P P 2024 - *CIEJA Santana / Tucuruvi*Viviane Moreiras
 
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptxSlides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptxLuizHenriquedeAlmeid6
 
Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!Ilda Bicacro
 
Jogo de Rimas - Para impressão em pdf a ser usado para crianças
Jogo de Rimas - Para impressão em pdf a ser usado para criançasJogo de Rimas - Para impressão em pdf a ser usado para crianças
Jogo de Rimas - Para impressão em pdf a ser usado para criançasSocorro Machado
 

Último (20)

Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdfReta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
 
Seminário Biologia e desenvolvimento da matrinxa.pptx
Seminário Biologia e desenvolvimento da matrinxa.pptxSeminário Biologia e desenvolvimento da matrinxa.pptx
Seminário Biologia e desenvolvimento da matrinxa.pptx
 
Nós Propomos! Autocarros Elétricos - Trabalho desenvolvido no âmbito de Cidad...
Nós Propomos! Autocarros Elétricos - Trabalho desenvolvido no âmbito de Cidad...Nós Propomos! Autocarros Elétricos - Trabalho desenvolvido no âmbito de Cidad...
Nós Propomos! Autocarros Elétricos - Trabalho desenvolvido no âmbito de Cidad...
 
PROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.pdf
PROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.pdfPROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.pdf
PROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.pdf
 
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdf
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdfApresentação ISBET Jovem Aprendiz e Estágio 2023.pdf
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdf
 
19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf
 
Currículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdfCurrículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdf
 
PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...
PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...
PROJETO DE EXTENSÃO I - TECNOLOGIA DA INFORMAÇÃO Relatório Final de Atividade...
 
Camadas da terra -Litosfera conteúdo 6º ano
Camadas da terra -Litosfera  conteúdo 6º anoCamadas da terra -Litosfera  conteúdo 6º ano
Camadas da terra -Litosfera conteúdo 6º ano
 
Responde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptx
Responde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptxResponde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptx
Responde ou passa na HISTÓRIA - REVOLUÇÃO INDUSTRIAL - 8º ANO.pptx
 
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdfGEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
 
PROJETO DE EXTENSÃO I - Radiologia Tecnologia
PROJETO DE EXTENSÃO I - Radiologia TecnologiaPROJETO DE EXTENSÃO I - Radiologia Tecnologia
PROJETO DE EXTENSÃO I - Radiologia Tecnologia
 
Atividade - Letra da música Esperando na Janela.
Atividade -  Letra da música Esperando na Janela.Atividade -  Letra da música Esperando na Janela.
Atividade - Letra da música Esperando na Janela.
 
apostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médioapostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médio
 
praticas experimentais 1 ano ensino médio
praticas experimentais 1 ano ensino médiopraticas experimentais 1 ano ensino médio
praticas experimentais 1 ano ensino médio
 
Revolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividadesRevolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividades
 
P P P 2024 - *CIEJA Santana / Tucuruvi*
P P P 2024  - *CIEJA Santana / Tucuruvi*P P P 2024  - *CIEJA Santana / Tucuruvi*
P P P 2024 - *CIEJA Santana / Tucuruvi*
 
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptxSlides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
 
Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!
 
Jogo de Rimas - Para impressão em pdf a ser usado para crianças
Jogo de Rimas - Para impressão em pdf a ser usado para criançasJogo de Rimas - Para impressão em pdf a ser usado para crianças
Jogo de Rimas - Para impressão em pdf a ser usado para crianças
 

(ACH2002) Introdução à Análise de Algoritmos - Aula 16

  • 1. Aula 16 – Heaps Norton Trevisan Roman norton@usp.br 16 de outubro de 2018 Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 1 / 27
  • 2. Heaps Defini¸c˜ao Estrutura de dados definida como uma sequˆencia S de itens com valores S[1], S[2], . . . , S[n] tais que S[i] ≥ S[2i] S[i] ≥ S[2i + 1] para todo i = 1, 2, . . . , n/2 Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 2 / 27
  • 3. Heaps Defini¸c˜ao Estrutura de dados definida como uma sequˆencia S de itens com valores S[1], S[2], . . . , S[n] tais que S[i] ≥ S[2i] S[i] ≥ S[2i + 1] para todo i = 1, 2, . . . , n/2 Heap m´aximo Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 2 / 27
  • 4. Heaps Defini¸c˜ao Se, contudo, quisermos um heap m´ınimo, basta mudarmos a defini¸c˜ao para S[i] ≤ S[2i] S[i] ≤ S[2i + 1] para todo i = 1, 2, . . . , n/2 Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 3 / 27
  • 5. Heaps Visualiza¸c˜ao Para entender o heap, considere uma uma ´arvore bin´aria completa Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
  • 6. Heaps Visualiza¸c˜ao Para entender o heap, considere uma uma ´arvore bin´aria completa Ou seja, a ´arvore bin´aria em que todas as folhas tˆem a mesma profundidade e todos os n´os internos tˆem 2 filhos Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
  • 7. Heaps Visualiza¸c˜ao Para entender o heap, considere uma uma ´arvore bin´aria completa Ou seja, a ´arvore bin´aria em que todas as folhas tˆem a mesma profundidade e todos os n´os internos tˆem 2 filhos 1 2 3 4 5 6 7 Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
  • 8. Heaps Visualiza¸c˜ao Para entender o heap, considere uma uma ´arvore bin´aria completa Ou seja, a ´arvore bin´aria em que todas as folhas tˆem a mesma profundidade e todos os n´os internos tˆem 2 filhos 1 2 3 4 5 6 7 raiz Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
  • 9. Heaps Visualiza¸c˜ao Para entender o heap, considere uma uma ´arvore bin´aria completa Ou seja, a ´arvore bin´aria em que todas as folhas tˆem a mesma profundidade e todos os n´os internos tˆem 2 filhos 1 2 3 4 5 6 7 folhas Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
  • 10. Heaps Visualiza¸c˜ao Para entender o heap, considere uma uma ´arvore bin´aria completa Ou seja, a ´arvore bin´aria em que todas as folhas tˆem a mesma profundidade e todos os n´os internos tˆem 2 filhos 1 2 3 4 5 6 7 Profundidade de um n´o: distˆancia do n´o `a raiz, em n´umero de arestas Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
  • 11. Heaps Visualiza¸c˜ao Para entender o heap, considere uma uma ´arvore bin´aria completa Ou seja, a ´arvore bin´aria em que todas as folhas tˆem a mesma profundidade e todos os n´os internos tˆem 2 filhos 1 2 3 4 5 6 7 Altura de um n´o: distˆancia descendente (em arestas) do maior caminho entre esse n´o e uma folha Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
  • 12. Heaps Visualiza¸c˜ao Para entender o heap, considere uma uma ´arvore bin´aria completa Ou seja, a ´arvore bin´aria em que todas as folhas tˆem a mesma profundidade e todos os n´os internos tˆem 2 filhos 1 2 3 4 5 6 7 A altura da ´arvore ser´a a altura de sua raiz Norton Trevisan Romannorton@usp.br Aula 16 – Heaps 16 de outubro de 2018 4 / 27
  • 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