131

@let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Melhores momentos

AULA 20

Page 2: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Resumo

função consumo de observaçãotempo

bubble O(n2) todos os casosinsercao O(n2) pior caso

O(n) melhor casoinsercaoBinaria O(n2) pior caso

O(n lg n) melhor casoselecao O(n2) todos os casosmergeSort O(n lg n) todos os casosquickSort O(n2) pior caso

O(n lg n) melhor caso

Page 3: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Divisão e conquistaAlgoritmos por divisão-e-conquista têm três passosem cada nível da recursão:

Dividir: o problema é dividido em subproblemas detamanho menor;

Conquistar: os subproblemas são resolvidosrecursivamente e subproblemas�pequenos� são resolvidos diretamente;

Combinar: as soluções dos subproblemas sãocombinadas para obter uma solução doproblema original.

Exemplo: ordenação por intercalação (mergeSort).

Page 4: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

AULA 21

Page 5: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Árvores em vetores e heaps

Fonte: http://xkcd.com/835/

PF 10http://www.ime.usp.br/�pf/algoritmos/aulas/hpsrt.html

Page 6: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Representação de árvores em vetores

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 7: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Pais e filhos

v[1 . . m] é um vetor representando uma árvore.

Diremos que para qualquer índice ou nó i,

I bi/2c é o pai de i;

I 2 i é o �lho esquerdo de i;

I 2 i+1 é o �lho direito.

Um nó i só tem �lho esquerdo se 2 i ≤ m.

Um nó i só tem �lho direito se 2 i+1 ≤ m.

Page 8: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Raiz e folhas

O nó 1 não tem pai e é chamado de raiz.

Um nó i é um folha se não tem �lhos, ou seja2 i > m.

Todo nó i é raiz da subárvore formada por

v[i, 2i, 2i+1, 4i, 4i+1, 4i+2, 4i+3, 8i, . . . , 8i+7, . . .]

Page 9: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Níveis

Cada nível p, exceto talvez o último, tem exatamente2p nós e esses são

2p, 2p + 1, 2p + 2, . . . , 2p+1 − 1.

Prova: Se p é o nível do nó i, então

2p ≤ i < 2p+1 ⇒lg 2p ≤ lg i < lg 2p+1 ⇒

p ≤ lg i < p+ 1

Logo, p = blg ic.

Page 10: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Níveis

Cada nível p, exceto talvez o último, tem exatamente2p nós e esses são

2p, 2p + 1, 2p + 2, . . . , 2p+1 − 1.

O nó i pertence ao nível ???.

Prova: Se p é o nível do nó i, então

2p ≤ i < 2p+1 ⇒lg 2p ≤ lg i < lg 2p+1 ⇒

p ≤ lg i < p+ 1

Logo, p = blg ic.

Page 11: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Níveis

Cada nível p, exceto talvez o último, tem exatamente2p nós e esses são

2p, 2p + 1, 2p + 2, . . . , 2p+1 − 1.

O nó i pertence ao nível blg ic.

Prova: Se p é o nível do nó i, então

2p ≤ i < 2p+1 ⇒lg 2p ≤ lg i < lg 2p+1 ⇒

p ≤ lg i < p+ 1

Logo, p = blg ic.

Page 12: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Níveis

Cada nível p, exceto talvez o último, tem exatamente2p nós e esses são

2p, 2p + 1, 2p + 2, . . . , 2p+1 − 1.

O nó i pertence ao nível blg ic.Prova: Se p é o nível do nó i, então

2p ≤ i < 2p+1 ⇒lg 2p ≤ lg i < lg 2p+1 ⇒

p ≤ lg i < p+ 1

Logo, p = blg ic.

Page 13: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Níveis

Cada nível p, exceto talvez o último, tem exatamente2p nós e esses são

2p, 2p + 1, 2p + 2, . . . , 2p+1 − 1.

O nó i pertence ao nível blg ic.Prova: Se p é o nível do nó i, então

2p ≤ i < 2p+1 ⇒lg 2p ≤ lg i < lg 2p+1 ⇒

p ≤ lg i < p+ 1

Logo, p = blg ic.Portanto, o número total de níveis é ???.

Page 14: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Níveis

Cada nível p, exceto talvez o último, tem exatamente2p nós e esses são

2p, 2p + 1, 2p + 2, . . . , 2p+1 − 1.

O nó i pertence ao nível blg ic.Prova: Se p é o nível do nó i, então

2p ≤ i < 2p+1 ⇒lg 2p ≤ lg i < lg 2p+1 ⇒

p ≤ lg i < p+ 1

Logo, p = blg ic.Portanto, o número total de níveis é 1 + blg mc.

Page 15: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Altura

A altura de um nó i é o maior comprimento de umcaminho de i a uma folha.

Em outras palavras, a altura de um nó i é o maiorcomprimento de uma seqüência da forma

〈filho(i), filho(filho(i)), filho(filho(filho(i))), . . .〉

onde filho(i) vale 2i ou 2i+ 1.

Os nós que têm altura zero são as folhas.

A altura de um nó i é blg(m/i)c (. . . ).

Page 16: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Altura

A altura de um nó i é o maior comprimento de umcaminho de i a uma folha.

Em outras palavras, a altura de um nó i é o maiorcomprimento de uma seqüência da forma

〈filho(i), filho(filho(i)), filho(filho(filho(i))), . . .〉

onde filho(i) vale 2i ou 2i+ 1.

Os nós que têm altura zero são as folhas.

A altura de um nó i é blg(m/i)c (. . . ).

Page 17: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Resumão

�lho esquerdo de i: 2 i�lho direito de i: 2 i+ 1pai de i: bi/2c

nível da raiz: 0nível de i: blg ic

altura da raiz: blg mcaltura da árvore: blg mcaltura de i: blg(m/i)c (. . . )altura de uma folha: 0total de nós de altura h ≤ dm/2h+1e (. . . )

Page 18: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heaps

Um vetor v[1 . . m] é um max-heap se

v[i/2] ≥ v[i]

para todo i = 2, 3, . . . , m.

De uma forma mais geral, v[j . . m] é um max-heap se

v[i/2] ≥ v[i]

para todoi = 2j, 2j+ 1, 4j, . . . , 4j+ 3, 8j, . . . , 8j+ 7, . . ..Neste caso também diremos que a subárvore comraiz j é um max-heap.

Page 19: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

max-heap

21 10

17

15 14 10 12

41

12

21

23

34

30

51 46 17 4134 23 30

14

46

51

15

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 20: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Função básica de manipulação de max-heap

21 10

17

15 14 10 12

41

12

21

23

34

30

13 46 17 4134 23 30

14

46

13

15

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 21: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Função básica de manipulação de max-heap

21 10

17

15 14 10 12

41

12

21

23

34

30

46 13 17 4134 23 30

14

13

46

15

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 22: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Função básica de manipulação de max-heap

21 10

17

15 14 10 12

13

12

21

23

34

30

46 41 17 1334 23 30

14

41

46

15

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 23: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Função básica de manipulação de max-heap

13 10

17

15 14 10 12

21

12

13

23

34

30

46 41 17 2134 23 30

14

41

46

15

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 24: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Função básica de manipulação de max-heap

13 10

17

15 14 10 12

21

12

13

23

34

30

46 41 17 2134 23 30

14

41

46

15

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 25: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Função peneira

O coração de qualquer algoritmo que manipule ummax-heap é uma função que recebe um vetorarbitrário v[1 . . m] e um índice i e faz v[i] �descer�para sua posição correta.

void peneira (int i, int m, int v[]) {

1 int f = 2*i, x;

2 while (f <= m) {

3 if (f < m && v[f] < v[f+1]) f++;

4 if (v[i] >= v[f]) break;

5 x = v[i]; v[i] = v[f]; v[f] = x;

6 i = f; f = 2*i;

}

}

Page 26: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Função peneira

Rearranja o vetor v[1 . . m] de modo que o�subvetor� cuja raiz é i seja um max-heap.

void peneira (int i, int m, int v[]) {

1 int f = 2*i, x;

2 while (f <= m) {

3 if (f < m && v[f] < v[f+1]) f++;

4 if (v[i] >= v[f]) break;

5 x = v[i]; v[i] = v[f]; v[f] = x;

6 i = f; f = 2*i;

}

}

Page 27: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Função peneira

Supõe que os "subvetores"cujas raízes são �lhos de ijá são max-heap.

void peneira (int i, int m, int v[]) {

1 int f = 2*i, x;

2 while (f <= m) {

3 if (f < m && v[f] < v[f+1]) f++;

4 if (v[i] >= v[f]) break;

5 x = v[i]; v[i] = v[f]; v[f] = x;

6 i = f; f = 2*i;

}

}

Page 28: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Função peneira

A seguinte implementação é um pouco melhor poisem vez de trocas faz apenas deslocamentos (linha 5).

void peneira (int i, int m, int v[]) {

1 int f = 2*i, x = v[i];

2 while (f <= m) {

3 if (f < m && v[f] < v[f+1]) f++;

4 if (x >= v[f]) break;

5 v[i] = v[f];

6 i = f; f = 2*i;

}

7 v[i] = x;

}

Page 29: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Consumo de tempo

linha todas as execuções da linha1 = 12 ≤ 1 + lg m3 ≤ lg m4 ≤ lg m5 ≤ lg m6 ≤ lg m7 = 1

total ≤ 3 + 5 lg m = O(lg m)

Page 30: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Conclusão

O consumo de tempo da função peneira éproporcional a lg m.

O consumo de tempo da função peneira éO(lg m).

Verdade seja dita . . . (. . . )

O consumo de tempo da função peneira éproporcional a O(lg m/i).

Page 31: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Construção de um max-heap

41 30

34

10 46 30 21

15

21

41

23

17

12

14 13 34 1517 23 12

46

13

14

10

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 32: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Construção de um max-heap

41 30

34

10 46 30 21

15

21

41

23

17

12

14 13 34 1517 23 12

46

13

14

10

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 33: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Construção de um max-heap

41 30

34

21 46 30 10

15

10

41

23

17

12

14 13 34 1517 23 12

46

13

14

21

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 34: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Construção de um max-heap

41 30

34

21 46 30 10

15

10

41

23

17

12

14 13 34 1517 23 12

46

13

14

21

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 35: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Construção de um max-heap

15 30

34

21 46 30 10

41

10

15

23

17

12

14 13 34 4117 23 12

46

13

14

21

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 36: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Construção de um max-heap

15 30

34

21 46 30 10

41

10

15

23

17

12

14 13 34 4117 23 12

46

13

14

21

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 37: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Construção de um max-heap

15 30

34

21 46 30 10

41

10

15

17

23

12

14 13 34 4123 17 12

46

13

14

21

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 38: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Construção de um max-heap

15 30

34

21 46 30 10

41

10

15

17

23

12

14 13 34 4123 17 12

46

13

14

21

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 39: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Construção de um max-heap

15 30

46

21 34 30 10

41

10

15

17

23

12

14 13 46 4123 17 12

34

13

14

21

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 40: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Construção de um max-heap

15 30

46

21 34 30 10

41

10

15

17

23

12

14 13 46 4123 17 12

34

13

14

21

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 41: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Construção de um max-heap

15 30

46

21 34 30 10

13

10

15

17

23

12

14 41 46 1323 17 12

34

41

14

21

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 42: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Construção de um max-heap

15 13

46

21 34 13 10

30

10

15

17

23

12

14 41 46 3023 17 12

34

41

14

21

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 43: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Construção de um max-heap

15 13

46

21 34 13 10

30

10

15

17

23

12

14 41 46 3023 17 12

34

41

14

21

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 44: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Construção de um max-heap

15 13

14

21 34 13 10

30

10

15

17

23

12

46 41 14 3023 17 12

34

41

46

21

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 45: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Construção de um max-heap

15 13

34

21 14 13 10

30

10

15

17

23

12

46 41 34 3023 17 12

14

41

46

21

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 46: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Construção de um max-heap

15 13

34

21 14 13 10

30

10

15

17

23

12

46 41 34 3023 17 12

14

41

46

21

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 47: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Construção de um max-heap

Recebe um vetor v[1 . . n] e rearranja v para que sejamax-heap.

1 for (i = n/2; /*A*/ i >= 1; i--)

2 peneira(i, n, v);

Relação invariante:

(i0) em /*A*/ vale que, i+1, . . . , n são raízes demax-heaps.

Page 48: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Consumo de tempo

Análise grosseira: consumo de tempo é

n

2× lg n = O(n lg n).

Verdade seja dita . . . (. . . )

Análise mais cuidadosa: consumo de tempo é O(n).

Page 49: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Conclusão

O consumo de tempo para construir ummax-heap é O(n lg n).

Verdade seja dita . . . (. . . )

O consumo de tempo para construir ummax-heap é O(n).

Page 50: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Ordenação: algoritmo Heapsort

PF 10http://www.ime.usp.br/�pf/algoritmos/aulas/hpsrt.html

Page 51: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Ordenação

v[1 . . n] é crescente se v[1] ≤ · · · ≤ v[n].

Problema: Rearranjar um vetor v[1 . . n] de modo queele fique crescente.

Entra:

1 n

33 55 33 44 33 22 11 99 22 55 77

Sai:

1 n

11 22 22 33 33 33 44 55 55 77 99

Page 52: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

O Heapsort ilustra o uso de estruturas de dados noprojeto de algoritmos eficientes.Rearranjar um vetor v[1 . . n] de modo que ele fiquecrescente.

Entra:

1 n

33 55 33 44 33 22 11 99 22 55 77

Sai:

1 n

11 22 22 33 33 33 44 55 55 77 99

Page 53: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Ordenação por seleção

i = 5

1 max n

38 50 20 44 10 50 55 60 75 85 99

Page 54: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Ordenação por seleçãoi = 5

1 j max n

38 50 20 44 10 50 55 60 75 85 99

1 j max n

38 50 20 44 10 50 55 60 75 85 99

1 j max n

38 50 20 44 10 50 55 60 75 85 99

j max n

38 50 20 44 10 50 55 60 75 85 99

1 max n

38 50 20 44 10 50 55 60 75 85 99

Page 55: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Ordenação por seleçãoi = 5

1 j max n

38 50 20 44 10 50 55 60 75 85 99

1 j max n

38 50 20 44 10 50 55 60 75 85 99

1 j max n

38 50 20 44 10 50 55 60 75 85 99

j max n

38 50 20 44 10 50 55 60 75 85 99

1 max n

38 50 20 44 10 50 55 60 75 85 99

Page 56: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Ordenação por seleçãoi = 5

1 j max n

38 50 20 44 10 50 55 60 75 85 99

1 j max n

38 50 20 44 10 50 55 60 75 85 99

1 j max n

38 50 20 44 10 50 55 60 75 85 99

j max n

38 50 20 44 10 50 55 60 75 85 99

1 max n

38 50 20 44 10 50 55 60 75 85 99

Page 57: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Ordenação por seleçãoi = 5

1 j max n

38 50 20 44 10 50 55 60 75 85 99

1 j max n

38 50 20 44 10 50 55 60 75 85 99

1 j max n

38 50 20 44 10 50 55 60 75 85 99

j max n

38 50 20 44 10 50 55 60 75 85 99

1 max n

38 50 20 44 10 50 55 60 75 85 99

Page 58: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Ordenação por seleçãoi = 5

1 j max n

38 50 20 44 10 50 55 60 75 85 99

1 j max n

38 50 20 44 10 50 55 60 75 85 99

1 j max n

38 50 20 44 10 50 55 60 75 85 99

j max n

38 50 20 44 10 50 55 60 75 85 99

1 max n

38 50 20 44 10 50 55 60 75 85 99

Page 59: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Ordenação por seleção

1 i n

38 10 20 44 50 50 55 60 75 85 99

1 i n

38 10 20 44 50 50 55 60 75 85 99

1 i n

20 10 38 44 50 50 55 60 75 85 99

1 i n

10 20 38 44 50 50 55 60 75 85 99

Page 60: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Ordenação por seleção

1 i n

38 10 20 44 50 50 55 60 75 85 99

1 i n

38 10 20 44 50 50 55 60 75 85 99

1 i n

20 10 38 44 50 50 55 60 75 85 99

1 i n

10 20 38 44 50 50 55 60 75 85 99

Page 61: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Ordenação por seleção

1 i n

38 10 20 44 50 50 55 60 75 85 99

1 i n

20 10 38 44 50 50 55 60 75 85 99

1 i n

20 10 38 44 50 50 55 60 75 85 99

1 i n

10 20 38 44 50 50 55 60 75 85 99

Page 62: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Ordenação por seleção

1 i n

38 10 20 44 50 50 55 60 75 85 99

1 i n

20 10 38 44 50 50 55 60 75 85 99

1 i n

10 20 38 44 50 50 55 60 75 85 99

1 n

10 20 38 44 50 50 55 60 75 85 99

Page 63: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Função selecao

Algoritmo rearranja v[0 . . n−1] em ordem crescente

void selecao (int n, int v[])

{

int i, j, max, x;

1 for (i = n-1; /*B*/ i > 0; i--) {

2 max = i;

3 for (j = i-1; j >= 0; j--)

4 if (v[j] > v[max]) max = j;

5 x=v[i]; v[i]=v[max]; v[max]=x;

}

}

Page 64: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Função selecao

Algoritmo rearranja v[1 . . n] em ordem crescente

void selecao (int n, int v[])

{

int i, j, max, x;

1 for (i = n; /*B*/ i > 1; i--) {

2 max = i;

3 for (j = i-1; j >= 1; j--)

4 if (v[j] > v[max]) max = j;

5 x=v[i]; v[i]=v[max]; v[max]=x;

}

}

Page 65: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Função selecao

Relações invariantes: Em /*B*/ vale que:

(i0) v[i+1 . . n] é crescente;

(i1) v[1 . . i] ≤ v[i+1];

1 i n

38 10 20 44 50 50 55 60 75 85 99

Page 66: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

15 13

34

21 14 13 10

30

10

15

17

23

12

46 41 34 3023 17 12

14

41

46

21

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 67: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

15 13

34

21 14 13 46

30

46

15

17

23

12

10 41 34 3023 17 12

14

41

10

21

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 68: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

15 13

34

21 14 13 46

30

46

15

17

23

12

41 10 34 3023 17 12

14

10

41

21

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 69: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

15 13

34

21 14 13 46

10

46

15

17

23

12

41 30 34 1023 17 12

14

30

41

21

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 70: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

10 13

34

21 14 13 46

15

46

10

17

23

12

41 30 34 1523 17 12

14

30

41

21

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 71: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

10 13

34

21 14 13 46

15

46

10

17

23

12

41 30 34 1523 17 12

14

30

41

21

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 72: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

10 41

34

21 14 41 46

15

46

10

17

23

12

13 30 34 1523 17 12

14

30

13

21

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 73: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

10 41

34

21 14 41 46

15

46

10

17

23

12

13 30 34 1523 17 12

14

30

13

21

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 74: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

10 41

13

21 14 41 46

15

46

10

17

23

12

34 30 13 1523 17 12

14

30

34

21

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 75: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

10 41

21

13 14 41 46

15

46

10

17

23

12

34 30 21 1523 17 12

14

30

34

13

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 76: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

10 41

21

13 14 41 46

15

46

10

17

23

12

34 30 21 1523 17 12

14

30

34

13

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 77: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

21

13 14 41 46

15

46

34

17

23

12

10 30 21 1523 17 12

14

30

10

13

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 78: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

21

13 14 41 46

15

46

34

17

23

12

10 30 21 1523 17 12

14

30

10

13

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 79: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

21

13 14 41 46

15

46

34

17

23

12

30 10 21 1523 17 12

14

10

30

13

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 80: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

21

13 14 41 46

15

46

34

17

10

12

30 23 21 1510 17 12

14

23

30

13

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 81: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

21

13 14 41 46

15

46

34

10

17

12

30 23 21 1517 10 12

14

23

30

13

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 82: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

21

13 14 41 46

15

46

34

10

17

12

30 23 21 1517 10 12

14

23

30

13

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 83: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

21

13 14 41 46

15

46

34

10

17

30

12 23 21 1517 10 30

14

23

12

13

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 84: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

21

13 14 41 46

15

46

34

10

17

30

12 23 21 1517 10 30

14

23

12

13

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 85: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

21

13 14 41 46

15

46

34

10

17

30

23 12 21 1517 10 30

14

12

23

13

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 86: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

21

13 14 41 46

15

46

34

10

12

30

23 17 21 1512 10 30

14

17

23

13

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 87: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

21

13 14 41 46

15

46

34

10

12

30

23 17 21 1512 10 30

14

17

23

13

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 88: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

21

13 14 41 46

15

46

34

23

12

30

10 17 21 1512 23 30

14

17

10

13

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 89: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

21

13 14 41 46

15

46

34

23

12

30

10 17 21 1512 23 30

14

17

10

13

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 90: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

10

13 14 41 46

15

46

34

23

12

30

21 17 10 1512 23 30

14

17

21

13

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 91: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

14

13 10 41 46

15

46

34

23

12

30

21 17 14 1512 23 30

10

17

21

13

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 92: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

14

13 10 41 46

15

46

34

23

12

30

21 17 14 1512 23 30

10

17

21

13

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 93: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

14

13 21 41 46

15

46

34

23

12

30

10 17 14 1512 23 30

21

17

10

13

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 94: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

14

13 21 41 46

15

46

34

23

12

30

10 17 14 1512 23 30

21

17

10

13

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 95: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

14

13 21 41 46

15

46

34

23

12

30

17 10 14 1512 23 30

21

10

17

13

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 96: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

14

13 21 41 46

10

46

34

23

12

30

17 15 14 1012 23 30

21

15

17

13

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 97: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

14

13 21 41 46

10

46

34

23

12

30

17 15 14 1012 23 30

21

15

17

13

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 98: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

14

17 21 41 46

10

46

34

23

12

30

13 15 14 1012 23 30

21

15

13

17

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 99: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

14

17 21 41 46

10

46

34

23

12

30

13 15 14 1012 23 30

21

15

13

17

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 100: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

14

17 21 41 46

10

46

34

23

12

30

15 13 14 1012 23 30

21

13

15

17

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 101: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

14

17 21 41 46

10

46

34

23

12

30

15 13 14 1012 23 30

21

13

15

17

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 102: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

14

17 21 41 46

15

46

34

23

12

30

10 13 14 1512 23 30

21

13

10

17

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 103: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

14

17 21 41 46

15

46

34

23

12

30

10 13 14 1512 23 30

21

13

10

17

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 104: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

10

17 21 41 46

15

46

34

23

12

30

14 13 10 1512 23 30

21

13

14

17

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 105: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

10

17 21 41 46

15

46

34

23

12

30

14 13 10 1512 23 30

21

13

14

17

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 106: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

10

17 21 41 46

15

46

34

23

14

30

12 13 10 1514 23 30

21

13

12

17

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 107: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

10

17 21 41 46

15

46

34

23

14

30

12 13 10 1514 23 30

21

13

12

17

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 108: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

10

17 21 41 46

15

46

34

23

14

30

13 12 10 1514 23 30

21

12

13

17

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 109: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

10

17 21 41 46

15

46

34

23

14

30

13 12 10 1514 23 30

21

12

13

17

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 110: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

13

17 21 41 46

15

46

34

23

14

30

10 12 13 1514 23 30

21

12

10

17

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 111: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

13

17 21 41 46

15

46

34

23

14

30

10 12 13 1514 23 30

21

12

10

17

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 112: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

13

17 21 41 46

15

46

34

23

14

30

12 10 13 1514 23 30

21

10

12

17

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 113: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

13

17 21 41 46

15

46

34

23

14

30

12 10 13 1514 23 30

21

10

12

17

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 114: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

13

17 21 41 46

15

46

34

23

14

30

10 12 13 1514 23 30

21

12

10

17

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 115: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

13

17 21 41 46

15

46

34

23

14

30

10 12 13 1514 23 30

21

12

10

17

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 116: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

13

17 21 41 46

15

46

34

23

14

30

10 12 13 1514 23 30

21

12

10

17

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 117: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Heapsort

34 41

13

17 21 41 46

15

46

34

23

14

30

10 12 13 1514 23 30

21

12

10

17

0

1

2

3

nível1

2

4

8 9 10

5

11 12

6

3

7

1 2 3 4 5 6 7 8 9 10 11 12

Page 118: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Função heapSort

Algoritmo rearranja v[1 . . n] em ordem crescente

void heapSort (int n, int v[])

{

int i, x;

/* pre-processamento */

1 for (i = n/2; i >= 1; i--)

2 peneira(i, n, v);

3 for (i = n; /*C*/ i > 1; i--) {

4 x=v[i]; v[i]=v[1]; v[1]=x;

5 peneira(1,i-1,v);

}

}

Page 119: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Função heapSort

Relações invariantes: Em /*C*/ vale que:

(i0) v[i+1 . . n] é crescente;

(i1) v[1 . . i] ≤ v[i+1];

(i2) v[1 . . i] é um max-heap.

1 i n

50 44 10 38 20 50 55 60 75 85 99

Page 120: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Consumo de tempo

linha consumo de tempo das execuções da linha1-2 ≈ n lg n = O(n lg n)3 ≈ n = O(n)4 ≈ n = O(n)5 ≈ n lg n = O(n lg n)

total = 2n lg n+ 2n = O(n lg n)

Page 121: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Conclusão

O consumo de tempo da função heapSort éproporcional a n lg n.

O consumo de tempo da função heapSort éO(n lg n).

Page 122: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Função insereHeap

Inseção de um elemento x em um max-heap v[1 . . n]

void insereHeap (int x, int *n, int v[]) {

int f /* filho */, p/* pai */, t;

1 *n += 1; f = *n; p = f / 2; v[f] = x;

2 while/*D*/ (f > 1 && v[p] < v[f]) {

3 t = v[p];

4 v[p] = v[f];

5 v[f] = t;

/* pai no papel de filho */

6 f = p; p = f / 2;

}

}

Page 123: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Função insereHeap

Relações invariantes: Em /*D*/ vale que:

(i0) v[1 . . ∗ n] é uma permutação do vetor original

(i1) v[i/2] ≥ v[i] para todo i = 2, . . . , ∗ndiferente de f.

1 f ∗n83 75 25 68 99 15 10 60 57 65 79

Page 124: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Conclusão

O consumo de tempo da função insereHeap éproporcional a lg n, onde n é o número de

elementos no max-heap.

O consumo de tempo da função heapSort éO(n), onde n é o número de elementos no

max-heap.

Page 125: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Mais análise experimental

Algoritmos implementados:

mergeR mergeSort recursivo.

mergeI mergeSort iterativo.

quick quickSort recursivo.

heap heapSort.

Page 126: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Mais análise experimental

A plataforma utilizada nos experimentos foi umcomputador rodando Ubuntu GNU/Linux 3.5.0-17

Compilador:gcc -Wall -ansi -O2 -pedantic

-Wno-unused-result.

Computador:model name: Intel(R) Core(TM)2 Quad CPU Q6600 @

2.40GHz

cpu MHz : 1596.000

cache size: 4096 KB

MemTotal : 3354708 kB

Page 127: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Aleatório: média de 10

n mergeR mergeI quick heap

8192 0.00 0.00 0.00 0.0016384 0.00 0.00 0.00 0.0032768 0.01 0.01 0.01 0.0065536 0.01 0.01 0.01 0.01

131072 0.02 0.02 0.02 0.03262144 0.05 0.04 0.04 0.06524288 0.10 0.08 0.08 0.12

1048576 0.21 0.20 0.17 0.282097152 0.44 0.43 0.35 0.704194304 0.92 0.90 0.73 1.738388608 1.90 1.87 1.51 4.13

Tempos em segundos.

Page 128: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Decrescente

n mergeR mergeI quick heap

1024 0.00 0.00 0.00 0.002048 0.00 0.00 0.00 0.004096 0.01 0.00 0.01 0.008192 0.00 0.00 0.03 0.00

16384 0.00 0.00 0.14 0.0032768 0.00 0.01 0.57 0.0065536 0.01 0.01 2.27 0.01

131072 0.02 0.01 9.06 0.02262144 0.03 0.03 36.31 0.04

Tempos em segundos.

Para n=524288 quickSort dá Segmentation

fault (core dumped)

Page 129: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Crescente

n mergeR mergeI quick heap

1024 0.00 0.00 0.00 0.002048 0.00 0.00 0.00 0.004096 0.00 0.00 0.00 0.008192 0.00 0.00 0.03 0.00

16384 0.00 0.00 0.14 0.0132768 0.01 0.00 0.57 0.0165536 0.00 0.01 2.26 0.01

131072 0.02 0.02 9.05 0.02262144 0.03 0.02 36.21 0.04

Tempos em segundos.

Para n=524288 quickSort dá Segmentation

fault (core dumped)

Page 130: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Resumo

função consumo de observaçãotempo

bubble O(n2) todos os casosinsercao O(n2) pior caso

O(n) melhor casoinsercaoBinaria O(n2) pior caso

O(n lg n) melhor casoselecao O(n2) todos os casosmergeSort O(n lg n) todos os casosquickSort O(n2) pior caso

O(n lg n) melhor casoheapSort O(n lg n) todos os casos

Page 131: @let@token MAC0122 Princípios de …mario/ensino/MAC0122_Coelho/aula21...Algoritmos pordivisão-e-conquistatêm três passos em cada nível da recursão: Dividir: o problema é dividido

Animação de algoritmos de ordenação

Criados por Nicholas André Pinho de Oliveira:http://nicholasandre.com.br/sorting/

Criados na Sapientia University (Romania):https://www.youtube.com/channel/UCIqiLefbVHsOAXDAxQJH7Xw