Top Banner
HEAP Vanessa Braganholo Estruturas de Dados e Seus Algoritmos
80

HEAP - Universidade Federal Fluminense

Apr 07, 2022

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: HEAP - Universidade Federal Fluminense

HEAP Vanessa BraganholoEstruturas de Dados e Seus Algoritmos

Page 2: HEAP - Universidade Federal Fluminense

PRIORIDADE

Algumas aplicações precisam recuperar rapidamente um dado de maior prioridade

Exemplo: lista de tarefas ­ A cada momento, deve-se executar a tarefa que tem mais prioridade­ Selecionar a tarefa mais prioritária de uma lista e retirá-la da lista­ Prioridades podem mudar­ Novas tarefas podem chegar e precisam ser acomodadas

2

Page 3: HEAP - Universidade Federal Fluminense

LISTA DE PRIORIDADES

Tabela onde cada registro está associado a uma prioridade

Prioridade: valor numérico armazenado em um dos campos do registro

3

Page 4: HEAP - Universidade Federal Fluminense

OPERAÇÕES

Seleção do elemento de maior prioridade

Inserção de novo elemento

Remoção do elemento de maior prioridade

Alteração da prioridade de um determinado elemento

4

Page 5: HEAP - Universidade Federal Fluminense

IMPLEMENTAÇÃO DE LISTAS DE PRIORIDADE

Lista não ordenada

Lista ordenada

Heap

5

Page 6: HEAP - Universidade Federal Fluminense

IMPLEMENTAÇÃO DE LISTAS DE PRIORIDADE

Lista não ordenada

Lista ordenada

Heap

6

Page 7: HEAP - Universidade Federal Fluminense

IMPLEMENTAÇÃO POR LISTA NÃO ORDENADA

Inserção e Construção: elementos (registros) podem ser colocados na tabela em qualquer ordem

Remoção: percorrer a tabela sequencialmente em busca do elemento de maior prioridade

Alteração: não implica em mudança na estrutura da tabela, mas exige busca do elemento a ser alterado

Seleção: idem à Remoção

7

Page 8: HEAP - Universidade Federal Fluminense

COMPLEXIDADE

Para uma tabela com n elementos­ Seleção: O(n)­ Inserção: O(1)­ Remoção: O(n)­ Alteração: O(n)­ Construção: O(n)

8

Page 9: HEAP - Universidade Federal Fluminense

IMPLEMENTAÇÃO DE LISTAS DE PRIORIDADE

Lista não ordenada

Lista ordenada

Heap

9

Page 10: HEAP - Universidade Federal Fluminense

IMPLEMENTAÇÃO POR LISTA ORDENADA

Remoção e Seleção: imediata, pois elemento de maior prioridade é o primeiro da tabela

Inserção: exige percorrer a tabela para encontrar a posição correta de inserção

Alteração: semelhante a uma nova inserção

Construção: exige ordenação prévia da tabela

10

Page 11: HEAP - Universidade Federal Fluminense

COMPLEXIDADE

Para uma tabela com n elementos­ Seleção: O(1)­ Inserção: O(n)­ Remoção: O(1)­ Alteração: O(n)­ Construção: O(n log n) (complexidade da ordenação)

11

Page 12: HEAP - Universidade Federal Fluminense

IMPLEMENTAÇÃO DE LISTAS DE PRIORIDADE

Lista não ordenada

Lista ordenada

Heap

12

Page 13: HEAP - Universidade Federal Fluminense

IMPLEMENTAÇÃO POR HEAP

Mais eficiente na atualização do que as alternativas anteriores, que eram O(n)

13

Page 14: HEAP - Universidade Federal Fluminense

HEAP

Lista linear (vetor) composta de elementos com chaves s1, ..., snChaves representam as prioridades

Não existem dois elementos com a mesma prioridade

Heap máximo: chaves s1, ..., sn, tal que si ≤ si/2 para 1< i ≤ n

Heap mínimo: chaves s1, ..., sn, tal que si ≥ si/2 para 1< i ≤ n

Nessa aula, focaremos em Heap Máximo

14

Page 15: HEAP - Universidade Federal Fluminense

HEAP MÁXIMO

Lista linear composta de elementos com chaves s1, ..., sn, tal que si ≤ si/2 para 1< i ≤ n

Exemplo

95 60 78 39 28 66 70 33

15

Page 16: HEAP - Universidade Federal Fluminense

HEAP MÁXIMO

Lista linear composta de elementos com chaves s1, ..., sn, tal que si ≤ si/2 para 1< i ≤ n

Exemplo

95 60 78 39 28 66 70 33

16

<

2 4

Page 17: HEAP - Universidade Federal Fluminense

HEAP MÁXIMO

Lista linear composta de elementos com chaves s1, ..., sn, tal que si ≤ si/2 para 1< i ≤ n

Exemplo

95 60 78 39 28 66 70 33

17

95

60 78

39

33

28 7066

Lista representada como uma árvore binária completa

(subárvores vazias apenas no último ou penúltimo nível)

Page 18: HEAP - Universidade Federal Fluminense

MONTAGEM DA ÁRVORE BINÁRIA

Nós da árvore são gerados sequencialmente, da raiz para os níveis mais baixos, da esquerda para a direita

95 60 78 39 28 66 70 33

18

95

60 78

39

33

28 7066

Page 19: HEAP - Universidade Federal Fluminense

MONTAGEM DA ÁRVORE BINÁRIA

Nós da árvore são gerados sequencialmente, da raiz para os níveis mais baixos, da esquerda para a direita

95 60 78 39 28 66 70 33

19

95

60 78

39

33

28 7066

Page 20: HEAP - Universidade Federal Fluminense

MONTAGEM DA ÁRVORE BINÁRIA

Nós da árvore são gerados sequencialmente, da raiz para os níveis mais baixos, da esquerda para a direita

95 60 78 39 28 66 70 33

20

95

60 78

39

33

28 7066

Page 21: HEAP - Universidade Federal Fluminense

MONTAGEM DA ÁRVORE BINÁRIA

Nós da árvore são gerados sequencialmente, da raiz para os níveis mais baixos, da esquerda para a direita

95 60 78 39 28 66 70 33

21

95

60 78

39

33

28 7066

Page 22: HEAP - Universidade Federal Fluminense

PROPRIEDADES

Cada nó possui prioridade maior do que seus dois filhos

O elemento de maior prioridade é sempre a raiz da árvore

A representação em memória pode ser feita usando um vetor (índice do primeiro elemento é 1)

22

95

60 78

39

33

28 7066

1 2 3 4 5 6 7 8

95 60 78 39 28 66 70 33

Page 23: HEAP - Universidade Federal Fluminense

IMPLEMENTAÇÃO EM MEMÓRIA

int main(void){int *heap;int n;

printf("Digite o tamanho do vetor de elementos: ");scanf("%d",&n);if(n <= 0) {

return 0;}

//vetor começará em 1, por isso alocação de tamanho n+1heap = (int *) malloc(sizeof(int) * (n + 1));

...

}

23

Implementação usa vetor de inteiros para simplificar,

mas na prática seria um vetor de struct com os dados (da tarefa,

por exemplo)

Page 24: HEAP - Universidade Federal Fluminense

PROPRIEDADES

Para um determinado elemento i: ­ pai de i é i/2­ filho esquerdo é i * 2­ filho direito é i * 2 + 1

24

95

60 78

39

33

28 7066

1 2 3 4 5 6 7 8

95 60 78 39 28 66 70 33

pai

Filho esquerdo

Filho direito

Page 25: HEAP - Universidade Federal Fluminense

IMPLEMENTAÇÃO EM MEMÓRIA

/* Lembrar que os índices assumem que o primeiro elemento está na posição 1 do vetor, e não na posição 0 */

int pai(int i){return (i/2);

}

int esq(int i){return (i*2);

}

int dir(int i){return (i*2+1);

}

25

95

60 78

39

33

28 7066

1 2 3 4 5 6 7 8

95 60 78 39 28 66 70 33

Page 26: HEAP - Universidade Federal Fluminense

ALTERAÇÃO DE PRIORIDADE

Ao alterar a prioridade de um nó, é necessário re-arrumar a heap para que ela respeite as prioridades­ Um nó que tem a prioridade aumentada precisa “subir” na árvore­ Um nó que tem a prioridade diminuída precisa “descer” na árvore

26

Page 27: HEAP - Universidade Federal Fluminense

EXEMPLO: AUMENTAR A PRIORIDADE DO NÓ 6 DE 66 PARA 98

27

95

60 78

39

33

28 7066

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8

95 60 78 39 28 66 70 33

Page 28: HEAP - Universidade Federal Fluminense

EXEMPLO: AUMENTAR A PRIORIDADE DO NÓ 6 DE 66 PARA 98

28

95

60 78

39

33

28 7098

1

2 3

4 5 6 7

8

Apenas o ramo que vai do nó atualizado até a raiz é afetado – o restante da árvore

permanece inalterado

1 2 3 4 5 6 7 8

95 60 78 39 28 98 70 33

Page 29: HEAP - Universidade Federal Fluminense

EXEMPLO: AUMENTAR A PRIORIDADE DO NÓ 6 DE 66 PARA 98

29

95

60 78

39

33

28 7098

1

2 3

4 5 6 7

8

Apenas o ramo que vai do nó atualizado até a raiz é afetado – o restante da árvore

permanece inalterado

1 2 3 4 5 6 7 8

95 60 78 39 28 98 70 33

Page 30: HEAP - Universidade Federal Fluminense

EXEMPLO: AUMENTAR A PRIORIDADE DO NÓ 6 DE 66 PARA 98

30

95

60 78

39

33

28 7098

1

2 3

4 5 6 7

8

“Subir” elemento alterado na árvore, fazendo trocas com o nó pai, até que a árvore volte a ficar correta (todo nó tem

prioridade maior que seus filhos)

1 2 3 4 5 6 7 8

95 60 78 39 28 98 70 33

Page 31: HEAP - Universidade Federal Fluminense

EXEMPLO: AUMENTAR A PRIORIDADE DO NÓ 6 DE 66 PARA 98

31

95

60 98

39

33

28 7078

1

2 3

4 5 6 7

8

“Subir” elemento alterado na árvore, fazendo trocas com o nó pai, até que a árvore volte a ficar correta (todo nó tem

prioridade maior que seus filhos)

1 2 3 4 5 6 7 8

95 60 98 39 28 78 70 33

Page 32: HEAP - Universidade Federal Fluminense

EXEMPLO: AUMENTAR A PRIORIDADE DO NÓ 6 DE 66 PARA 98

32

98

60 95

39

33

28 7078

1

2 3

4 5 6 7

8

“Subir” elemento alterado na árvore, fazendo trocas com o nó pai, até que a árvore volte a ficar correta (todo nó tem

prioridade maior que seus filhos)

1 2 3 4 5 6 7 8

98 60 95 39 28 78 70 33

Page 33: HEAP - Universidade Federal Fluminense

FUNÇÃO SUBIR

void subir(int *heap, int i) {int j = pai(i);if (j >= 1) {

if (heap[i] > heap[j]) {//faz a subidaint temp = heap[i];heap[i] = heap[j];heap[j] = temp;subir(heap, j);

}}

}

33

Page 34: HEAP - Universidade Federal Fluminense

EXEMPLO:DIMINUIR A PRIORIDADE DO NÓ 1 PARA 37

34

95

60 78

39

33

28 7066

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8

95 60 78 39 28 66 70 33

Page 35: HEAP - Universidade Federal Fluminense

EXEMPLO:DIMINUIR A PRIORIDADE DO NÓ 1 PARA 37

35

37

60 78

39

33

28 7066

1

2 3

4 5 6 7

8

“Descer” elemento alterado na árvore, fazendo trocas com o nó filho de maior

prioridade, até que a árvore volte a ficar correta

1 2 3 4 5 6 7 8

37 60 78 39 28 66 70 33

Page 36: HEAP - Universidade Federal Fluminense

EXEMPLO:DIMINUIR A PRIORIDADE DO NÓ 1 PARA 37

36

37

60 78

39

33

28 7066

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8

37 60 78 39 28 66 70 33

“Descer” elemento alterado na árvore, fazendo trocas com o nó filho de maior

prioridade, até que a árvore volte a ficar correta

Os dois filhos de i nesse exemplo são 60 e 78:

i = 1esq(i) = 2dir(i) = 3

Page 37: HEAP - Universidade Federal Fluminense

EXEMPLO:DIMINUIR A PRIORIDADE DO NÓ 1 PARA 37

37

37

60 78

39

33

28 7066

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8

37 60 78 39 28 66 70 33

“Descer” elemento alterado na árvore, fazendo trocas com o nó filho de maior

prioridade, até que a árvore volte a ficar correta

Os dois filhos de i nesse exemplo são 60 e 78:

i = 1esq(i) = 2dir(i) = 3

Page 38: HEAP - Universidade Federal Fluminense

EXEMPLO:DIMINUIR A PRIORIDADE DO NÓ 1 PARA 37

38

78

60 37

39

33

28 7066

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8

78 60 37 39 28 66 70 33

“Descer” elemento alterado na árvore, fazendo trocas com o nó filho de maior

prioridade, até que a árvore volte a ficar correta

Page 39: HEAP - Universidade Federal Fluminense

EXEMPLO:DIMINUIR A PRIORIDADE DO NÓ 1 PARA 37

39

78

60 37

39

33

28 7066

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8

78 60 37 39 28 66 70 33

“Descer” elemento alterado na árvore, fazendo trocas com o nó filho de maior

prioridade, até que a árvore volte a ficar correta

Page 40: HEAP - Universidade Federal Fluminense

EXEMPLO:DIMINUIR A PRIORIDADE DO NÓ 1 PARA 37

40

78

60 70

39

33

28 3766

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8

78 60 70 39 28 66 37 33

“Descer” elemento alterado na árvore, fazendo trocas com o nó filho de maior

prioridade, até que a árvore volte a ficar correta

Page 41: HEAP - Universidade Federal Fluminense

FUNÇÃO DESCER

void descer(int *heap, int i, int n){//descobre quem é o maior filho de iint e = esq(i);int d = dir(i);int maior = i;if (e<=n && heap[e] > heap[i]) {

maior=e;}if (d<=n && heap[d] > heap[maior]) {

maior=d;}if (maior != i){

//faz a descida trocando com o maior filhoint temp=heap[i];heap[i] = heap[maior];heap[maior]=temp;descer(heap, maior, n);

}}

41

Page 42: HEAP - Universidade Federal Fluminense

INSERÇÃO

Tabela com n elementos

Inserir novo elemento na posição n+1 da tabela

Assumir que esse elemento já existia e teve sua prioridade aumentada

Executar algoritmo de subida na árvore para corrigir a prioridade e colocar o novo elemento na posição correta

42

Page 43: HEAP - Universidade Federal Fluminense

EXEMPLO: INSERIR ELEMENTO 73

43

95

60 78

39

33

28 7066

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8

95 60 78 39 28 66 70 33

Page 44: HEAP - Universidade Federal Fluminense

EXEMPLO: INSERIR ELEMENTO 73

44

95

60 78

39

33

28 7066

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8 9

95 60 78 39 28 66 70 33 73

73

9

Page 45: HEAP - Universidade Federal Fluminense

EXEMPLO: INSERIR ELEMENTO 73

45

95

60 78

73

33

28 7066

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8 9

95 60 78 73 28 66 70 33 39

39

9

Page 46: HEAP - Universidade Federal Fluminense

EXEMPLO: INSERIR ELEMENTO 73

46

95

73 78

60

33

28 7066

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8 9

95 73 78 60 28 66 70 33 39

39

9

Page 47: HEAP - Universidade Federal Fluminense

EXEMPLO: INSERIR ELEMENTO 73

47

95

73 78

60

33

28 7066

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8 9

95 73 78 60 28 66 70 33 39

39

9

Page 48: HEAP - Universidade Federal Fluminense

INSERÇÃO

int insere(int *heap, int novo, int n) {//aumenta o tamanho do vetorheap = (int *) realloc(heap, sizeof(int) * (n + 2));n = n + 1;heap[n] = novo;

subir(heap, n);//retorna o novo valor de nreturn n;

}

48

Page 49: HEAP - Universidade Federal Fluminense

REMOÇÃO DO ELEMENTO MAIS PRIORITÁRIO

Remover o primeiro elemento da tabela

Preencher o espaço vazio deixado por ele com o último elemento da tabela

Executar o algoritmo de descida na árvore para corrigir a prioridade desse elemento

49

Page 50: HEAP - Universidade Federal Fluminense

EXEMPLOREMOVER ELEMENTO MAIS PRIORITÁRIO

50

95

60 78

39

33

28 7066

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8

95 60 78 39 28 66 70 33

Page 51: HEAP - Universidade Federal Fluminense

EXEMPLOREMOVER ELEMENTO MAIS PRIORITÁRIO

51

60 78

39

33

28 7066

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8

60 78 39 28 66 70 33

Page 52: HEAP - Universidade Federal Fluminense

EXEMPLOREMOVER ELEMENTO MAIS PRIORITÁRIO

52

33

60 78

39

33

28 7066

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8

33 60 78 39 28 66 70

Page 53: HEAP - Universidade Federal Fluminense

EXEMPLOREMOVER ELEMENTO MAIS PRIORITÁRIO

53

33

60 78

39 28 7066

1

2 3

4 5 6 7

1 2 3 4 5 6 7

33 60 78 39 28 66 70

Page 54: HEAP - Universidade Federal Fluminense

EXEMPLOREMOVER ELEMENTO MAIS PRIORITÁRIO

54

33

60 78

39 28 7066

1

2 3

4 5 6 7

1 2 3 4 5 6 7

33 60 78 39 28 66 70

Page 55: HEAP - Universidade Federal Fluminense

EXEMPLOREMOVER ELEMENTO MAIS PRIORITÁRIO

55

78

60 33

39 28 7066

1

2 3

4 5 6 7

1 2 3 4 5 6 7

78 60 33 39 28 66 70

Page 56: HEAP - Universidade Federal Fluminense

EXEMPLOREMOVER ELEMENTO MAIS PRIORITÁRIO

56

78

60 33

39 28 7066

1

2 3

4 5 6 7

1 2 3 4 5 6 7

78 60 33 39 28 66 70

Page 57: HEAP - Universidade Federal Fluminense

EXEMPLOREMOVER ELEMENTO MAIS PRIORITÁRIO

57

78

60 70

39 28 3366

1

2 3

4 5 6 7

1 2 3 4 5 6 7

78 60 70 39 28 66 33

Page 58: HEAP - Universidade Federal Fluminense

EXCLUSÃO

int exclui(int *heap, int n) {heap[1] = heap[n];n = n - 1;//diminui o tamanho do vetorheap = (int *) realloc(heap, sizeof(int) * (n + 1));

descer(heap, 1, n);//retorna o novo valor de nreturn n;

}

58

Page 59: HEAP - Universidade Federal Fluminense

CONSTRUÇÃO DE LISTA DE PRIORIDADES

Dada uma lista L de elementos para a qual se deseja construir uma heap H, há duas alternativas

1) Considerar uma heap vazia e ir inserindo os elementos de L um a um em H

2) Considerar que a lista L é uma heap, e corrigir as prioridades. ­ Assumir que as prioridades das folhas estão corretas (pois eles não têm filhos, então satisfazem à propriedade de terem prioridade maior que seus filhos)

­ Acertar as prioridades dos nós internos realizando descidas quando necessário

59

Page 60: HEAP - Universidade Federal Fluminense

EXEMPLOCONSTRUÇÃO DE HEAP

Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95

60

Page 61: HEAP - Universidade Federal Fluminense

EXEMPLOCONSTRUÇÃO DE HEAP

Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95

61

28

33 39

60

95

66 7870

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8

28 33 39 60 66 70 78 95

Page 62: HEAP - Universidade Federal Fluminense

EXEMPLOCONSTRUÇÃO DE HEAP

Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95

62

28

33 39

60

95

66 7870

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8

28 33 39 60 66 70 78 95

Acertar prioridade do elemento n/2 até o elemento 1, nessa ordem, realizando descidas

quando necessário

Page 63: HEAP - Universidade Federal Fluminense

EXEMPLOCONSTRUÇÃO DE HEAP

Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95

63

28

33 39

60

95

66 7870

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8

28 33 39 60 66 70 78 95

Acertar prioridade do elemento n/2 até o elemento 1, nessa ordem, realizando descidas

quando necessário

Page 64: HEAP - Universidade Federal Fluminense

EXEMPLOCONSTRUÇÃO DE HEAP

Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95

64

28

33 39

95

60

66 7870

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8

28 33 39 95 66 70 78 60

Acertar prioridade do elemento n/2 até o elemento 1, nessa ordem, realizando descidas

quando necessário

Page 65: HEAP - Universidade Federal Fluminense

EXEMPLOCONSTRUÇÃO DE HEAP

Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95

65

28

33 39

95

60

66 7870

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8

28 33 39 95 66 70 78 60

Acertar prioridade do elemento n/2 até o elemento 1, nessa ordem, realizando descidas

quando necessário

Page 66: HEAP - Universidade Federal Fluminense

EXEMPLOCONSTRUÇÃO DE HEAP

Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95

66

28

33 78

95

60

66 3970

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8

28 33 78 95 66 70 39 60

Acertar prioridade do elemento n/2 até o elemento 1, nessa ordem, realizando descidas

quando necessário

Page 67: HEAP - Universidade Federal Fluminense

EXEMPLOCONSTRUÇÃO DE HEAP

Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95

67

28

33 78

95

60

66 3970

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8

28 33 78 95 66 70 39 60

Acertar prioridade do elemento n/2 até o elemento 1, nessa ordem, realizando descidas

quando necessário

Page 68: HEAP - Universidade Federal Fluminense

EXEMPLOCONSTRUÇÃO DE HEAP

Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95

68

28

95 78

33

60

66 3970

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8

28 95 78 33 66 70 39 60

Acertar prioridade do elemento n/2 até o elemento 1, nessa ordem, realizando descidas

quando necessário

Page 69: HEAP - Universidade Federal Fluminense

EXEMPLOCONSTRUÇÃO DE HEAP

Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95

69

28

95 78

60

33

66 3970

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8

28 95 78 60 66 70 39 33

Acertar prioridade do elemento n/2 até o elemento 1, nessa ordem, realizando descidas

quando necessário

Page 70: HEAP - Universidade Federal Fluminense

EXEMPLOCONSTRUÇÃO DE HEAP

Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95

70

28

95 78

60

33

66 3970

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8

28 95 78 60 66 70 39 33

Acertar prioridade do elemento n/2 até o elemento 1, nessa ordem, realizando descidas

quando necessário

Page 71: HEAP - Universidade Federal Fluminense

EXEMPLOCONSTRUÇÃO DE HEAP

Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95

71

95

28 78

60

33

66 3970

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8

95 28 78 60 66 70 39 33

Acertar prioridade do elemento n/2 até o elemento 1, nessa ordem, realizando descidas

quando necessário

Page 72: HEAP - Universidade Federal Fluminense

EXEMPLOCONSTRUÇÃO DE HEAP

Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95

72

95

66 78

60

33

28 3970

1

2 3

4 5 6 7

8

1 2 3 4 5 6 7 8

95 66 78 60 28 70 39 33

Acertar prioridade do elemento n/2 até o elemento 1, nessa ordem, realizando descidas

quando necessário

Page 73: HEAP - Universidade Federal Fluminense

CONSTRUÇÃO DA HEAP

void constroi_heap_maximo(int *heap, int n){int i;int j=(n/2);for(i=j;i>=1;i--)

descer(heap, i, n);}

73

Page 74: HEAP - Universidade Federal Fluminense

COMPLEXIDADE

Seleção: imediata, pois elemento de maior prioridade é o primeiro da tabela – O(1)

Inserção, Alteração e Remoção: O(log n)

Construção: pode ser feita em O(n) (melhor que no cenário anterior, que exigia ordenação total)

74

Page 75: HEAP - Universidade Federal Fluminense

FUNCIONALIDADE ADICIONAL: ORDENAÇÃO

A partir da heap, é possível ordenar os dados, fazendo trocas: ­ O maior elemento (raiz) é trocado com o último elemento do vetor ­ Esse elemento então já está na posição correta (ordenação crescente)­ Considerar que vetor tem tamanho n-1 e descer a raiz para que o heap fique consistente ­ Repetir esses passos n-1 vezes

A Complexidade do heap sort é O(n log n)

75

Page 76: HEAP - Universidade Federal Fluminense

HEAP SORT

void heap_sort(int *heap, int n){int i;int j=n;constroi_heap_maximo(heap, n);for(i=n;i>1;i--){

//troca raiz com o ultimo elemento (posicao j)int temp=heap[i];heap[i]=heap[1];heap[1]=temp;//diminui o tamanho do vetor a ser considerado na heepj--;//desce com a raiz nessa nova heap de tamanho j-1descer(heap, 1, j);

}}

76

Page 77: HEAP - Universidade Federal Fluminense

EXERCÍCIOS

1. Verificar se essas sequências correspondem ou não a um heap

(a) 33 32 28 31 26 29 25 30 27

(b) 36 32 28 31 29 26 25 30 27

(c) 33 32 28 30 29 26 25 31 27

(d) 35 31 28 33 29 26 25 30 27

77

Page 78: HEAP - Universidade Federal Fluminense

EXERCÍCIOS

2. Seja o heap especificado a seguir: 92 85 90 47 71 34 20 40 46. Sobre esse heap, realizar as seguintes operações:

(a) Inserir os elementos 98, 75, 43

(b) Remover o elemento de maior prioridade (sobre o heap original)

(c) Remover o elemento de maior prioridade (sobre o heap resultante do exercício (b)

(d) Alterar a prioridade do 5º. nó de 71 para 93 (sobre o heap original)

(e) Alterar a prioridade do 5º. nó de 71 para 19 (sobre o heap original)

78

Page 79: HEAP - Universidade Federal Fluminense

IMPLEMENTAÇÃO DE HEAP EM DISCO

Ver implementação no site da disciplina

79

Page 80: HEAP - Universidade Federal Fluminense

REFERÊNCIA

Szwarcfiter, J.; Markezon, L. Estruturas de Dados e seus Algoritmos, 3a. ed. LTC. Cap. 6

80