41
Estruturas de Dados Avançadas (INF1010) Listas de Prioridade e Heaps

Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Estruturas de Dados Avançadas (INF1010)

Listas de Prioridade e Heaps

Page 2: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Listas de Prioridades

Em algumas aplicações, dados de coleções são acessados por ordem de prioridade

fila de impressão, escalonamento de tarefas, simulações

valor ordenável: tempo, custo, …

Operações que devem ser eficientes:

seleção/remoção de elemento com maior/menor prioridade

inserção de um novo elemento

Page 3: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Heap (binário)

Árvore Binária completa

min heap: cada nó é menor que seus filhos

max heap: cada nó é maior que seus filhos

1

3

7

2

3617 19

10025

100

36

1

19

2517 3

72

folhas estão no penúltimo ou último nível

Page 4: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Inserção

Insira o elemento no final do heap e faça-o “subir” até a posição correta

Page 5: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Inserção

Insira o elemento no final do heap e faça-o “subir” até a posição correta

Compare o elemento com seu pai:

● se estiver em ordem, a inserção terminou

● se não estiver, troque com o pai e repita o processo até terminar ou chegar à raiz

Page 6: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Exemplo de Inserção

11

85

3 4

15

Page 7: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Exemplo de Inserção

11

85

3 4

15 11

85

153 4

Page 8: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Exemplo de Inserção

11

85

3 4

15 11

85

153 4

11

85

153 4

Page 9: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Exemplo de Inserção

11

85

3 4

15 11

85

153 4

11

85

153 4

11

155

83 4

Page 10: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Exemplo de Inserção

11

85

3 4

15 11

85

153 4

11

85

153 4

11

155

83 4

11

155

83 4

Page 11: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Exemplo de Inserção

11

85

3 4

15 11

85

153 4

11

85

153 4

11

155

83 4

15

115

83 4

11

155

83 4

Page 12: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Remoção

Retira-se sempre a raiz

Coloque na raiz o último elemento do heap e faça-o “descer” até a posição correta

Page 13: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Remoção

Retira-se sempre a raiz

Coloque na raiz o último elemento do heap e faça-o “descer” até a posição correta

Compare o elemento com seus filhos:

● se estiver em ordem, a remoção terminou

● se não estiver, troque com o maior filho e repita o processo até terminar ou chegar a uma folha

Page 14: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Exemplo de Remoção

11

85

3 4

Page 15: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Exemplo de Remoção

11

85

3 4

11

85

3 4

Page 16: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Exemplo de Remoção

11

85

3 4

11

85

3 4

85

3 4

Page 17: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Exemplo de Remoção

11

85

3 4

11

85

3 4

85

3 4

4

85

3

Page 18: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Exemplo de Remoção

11

85

3 4

11

85

3 4

85

3 4

4

85

3

8

45

3

Page 19: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Eficiência

Operação Lista Lista

OrdenadaÁrvore

(Balanceada)Heap

Seleção O(n) O(1) O(log n) O(1)

Inserção O(1) O(n) O(log n) O(log n)

RemoçãoO(n) O(1) O(log n) O(log n)

Construção O(n) O(n log n) O(n log n) O(n)

Page 20: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Implementando Heap com Vetor

Podemos representar uma árvore binária (completa) com um vetor:

→ filho esquerdo de i: 2*i +1

→ filho direito de i: 2*i + 2

→ pai de i: (i-1)/2

índice 0 1 2 3 4 5 6 7 8 9 10 ...

nó a b c d e f g h i j k ...

nível 0 1 2 3

a

c

g

b

fd e

kih j

Page 21: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Implementando Heap com Vetor

Para armazenar uma árvore de altura h precisamos de um vetor de tamanho 2(h+1)–1

→ número de nós de uma árvore cheia de altura h

índice 0 1 2 3 4 5 6 7 8 9 10 ...

nó a b c d e f g h i j k ...

nível 0 1 2 3

a

c

g

b

fd e

kih j

Page 22: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Interface Heap

typedef struct heap Heap;

Heap* heap_cria(int max);

void heap_insere(Heap* heap, int prioridade, dados* d);

dados *heap_remove(Heap* heap);

void heap_libera(Heap *heap);

Page 23: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Implementando Módulo Heap

struct heap {

int max; /* tamanho maximo do heap */

int pos; /* proxima posicao disponivel no vetor */

int* prioridade; /* vetor das prioridades */

}; /* ignorando os dados! */

Heap* heap_cria(int max) {

Heap* heap=(Heap*)malloc(sizeof(struct heap));

heap->max=max;

heap->pos=0;

heap->prioridade=(int *)malloc(max*sizeof(int));

return heap;

}

Page 24: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Implementando Inserção

void heap_insere(Heap* heap, int prioridade) {

if ( heap->pos < heap->max ) {

heap->prioridade[heap->pos]=prioridade;

corrige_acima(heap,heap->pos);

heap->pos++;

}

else

printf("Heap CHEIO!\n");

}

Page 25: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

static void troca(int a, int b, int* v) {

int f = v[a];

v[a] = v[b];

v[b] = f;

}

static void corrige_acima(Heap* heap, int pos) {

int pai;

while (pos > 0) {

pai = (pos-1)/2;

if (heap->prioridade[pai] < heap->prioridade[pos])

troca(pos,pai,heap->prioridade);

else

break;

pos=pai;

}

}

Subindo o elemento

Page 26: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Implementando Remoção

int heap_remove(Heap* heap) {

if (heap->pos > 0) {

int topo = heap->prioridade[0];

heap->prioridade[0] = heap->prioridade[heap->pos-1];

heap->pos--;

corrige_abaixo(heap->prioridade, 0, heap->pos);

return topo;

}

else {

printf("Heap VAZIO!");

return -1;

}

}

Page 27: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Descendo o elementostatic void corrige_abaixo(int *prios, int atual, int tam){

int pai = atual;

int filho_esq, filho_dir, filho;

while (2*pai+1 < tam){

filho_esq=2*pai+1;

filho_dir=2*pai+2;

if (filho_dir >= tam) filho_dir=filho_esq;

if (prios[filho_esq] > prios[filho_dir])

filho = filho_esq;

else

filho = filho_dir;

if (prios[pai] < prios[filho])

troca(pai,filho,prios);

else

break;

pai = filho;

}

}

Page 28: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Construção de um Heap

Algoritmo ingênuo: inserção um-a-um

complexidade: O(n log n)

Observe que:

as folhas (elementos n/2 … n-1) já estão ordenadas, pois não têm descendentes

se acertarmos os nós internos (elementos 0 … n/2 - 1) em relação a seus descendentes, o heap estará pronto

devemos trabalhar de trás para frente, a partir de n/2 - 1, pois as propriedades do heap estão corretas nos níveis mais baixos

Page 29: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Exemplo

Lista de 11 prioridades

→ 21, 19, 16, 22, 17, 20, 23, 12, 34, 15, 60

Inserimos elementos nas posições de n/2 até n-1 (folhas)

1921

202216 17

Page 30: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Exemplo

Falta inserir: 23, 12, 34, 15, 60

Começamos de n/2 – 1

192123

202216 17

Page 31: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Exemplo

Falta inserir: 12, 34, 15, 60

1921

202216 17

12 23

Page 32: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Exemplo

Falta inserir: 34, 15, 60

1921

20

22

16 1712

23

Page 33: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Exemplo

Falta inserir: 34, 15, 60

1921

201216 17

34

2322

Page 34: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Exemplo

Falta inserir: 15, 60

1921

201216 17

15

2322

34

Page 35: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Exemplo

Falta inserir: 60

1921

201216 17

15

23

22

34

Page 36: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Exemplo

Falta inserir: 60

192120

1216 17 15

23

22

34

Page 37: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Exemplo

Falta inserir: 60

192120

1216 17

60

23

22

34

15

Page 38: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Complexidade da Construção

Se a árvore está cheia: → número de nós → n = 2h+1 – 1, onde h é a altura.

→ destes, apenas 2h – 1 são nós internos.

→ a raiz da árvore pode descer no máximo h níveis.

→ os dois nós de nível 1 podem descer h–1 níveis.

...

→ os 2h – 1 nós de nível h-1 podem descer 1 nível.

Logo, no total temos:

)1(2...)2(2)1(2)(1 12 hhhhS

Page 39: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Complexidade da Construção

Logo, o algoritmo de construção é O(n)

)1(2...)2(2)1(2)(1 12 hhhhS

)1(2...)2(2)1(2)(22 32 hhhhS

2S S 1(h) 222 ...2h12h

S h 2i

i0

h

å h(1 2h1)

(1 2) h (2h1 1) hn

Page 40: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Heapsort

Ordenação com complexidade O(n log n), mesmo no pior caso

Passo 1: construção do heap → O(n)

Passo 2: para os n elementos do heap → O(n log n)

→ remova o elemento do topo

→ salve o elemento no final do vetor de heap

Construção intuitiva:

→ à medida que os elementos vão sendo colocados no final, o heap diminui de tamanho

→ ao final, o vetor está em ordem decrescente (ou crescente)

Page 41: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Heap.pdf · 2019-10-15 · Heap (binário) Árvore Binária completa min heap: cada nó é menor que seus filhos max heap: cada

Ordenação do Vetor (min heap)

25 3023

2

10 14

18

2 10 14 23 18 25 30

10 18 14 23 30 25 2

14 18 25 23 30 2 10

18 23 25 30 2 10 14

23 30 25 2 10 14 18

25 30 2 10 14 18 23

30 2 10 14 18 23 25

2 10 14 18 23 25 30