60
INF 1010 Estruturas de Dados Avançadas Listas de Prioridades e Heaps 12/09/16 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1 1

INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

INF 1010Estruturas de Dados Avançadas

Listas de Prioridades e Heaps

12/09/16 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1 1

Page 2: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

uma outra aplicação de árvores binárias…

lista de prioridades:

• lista de elementos onde estamos interessados

apenas no ”maior de todos” ou ”menor de todos”

• seleção/remoção do elemento com maior (ou menor)

prioridade

• inserção de um novo elemento

12/09/16 2© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 3: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Listas de prioridades

814

645

10

23

16

45

23

21

Page 4: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Listas de Prioridades

Em muitas aplicações, dados de uma coleção são acessados por

ordem de prioridade.

A prioridade associada a um dado pode ser qualquer coisa: tempo,

custo, etc. Só precisa ser ordenável.

As operações que devem ser eficientes são:

• seleção do elemento com maior (ou menor) prioridade

• remoção do elemento de maior (ou menor) prioridade

• inserção de um novo elemento

12/09/16 4© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 5: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

implementação usando um heap (binário)

árvore binária completa

Min heap: Cada nó é menor que seus filhos

Max heap: Cada nó é maior que seus filhos

12/09/16 5

min heap max heap

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

100

36

1

19

2517 3

72

Page 6: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

O que é um heap (binário)

• Árvore binária completa

Min heap: Cada nó é menor que seus filhos

Max heap: Cada nó é maior que seus filhos

• e o que é uma árvore binária completa?

12/09/16 6

min heap max heap

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 7: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Árvore binária - conceitos

• número máximo de nós no nível i: ni = 2i

• número máximo de nós na árvore de altura

k:• nmax = 2k + … + 22 + 2 + 1 = 2k+1 - 1

12/09/16 7© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 8: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Árvore binária - conceitos

Árvore binária cheia de altura k:árvore com 2k+1 – 1 nós

Exemplo: para k = 2, árvore binária cheia possui 23-1 = 7 nós

12/09/16 8© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

A

C

G

B

FD E

nível:

0

1

2

Page 9: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Árvore binária - conceitos

9© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

A

C

G

B

FD E

nível:

0

1

2

1

2 3

4 5 6 7

Árvore binária cheia de altura k:árvore com 2k+1 – 1 nós

Exemplo: para k = 2, árvore binária cheia possui 23-1 = 7 nós

numeração

Page 10: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Árvore binária - conceitos

Árvore binária cheia de altura k:árvore com 2k+1 – 1 nós

Exemplo: para k = 2,

árvore binária cheia

possui 23-1 = 7 nós

Árvore binária completa• nós de 1 a n em árvore completa

• toda folha está no último

ou penúltimo nível

12/09/16 10© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

A

CB

D E

nível:

0

1

2

A

C

G

B

FD E

nível:

0

1

2

1

2 3

4 5 6 7

Page 11: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

O que é um heap (binário)

Árvore binária completa

Min heap: Cada nó é menor que seus filhos

Max heap: Cada nó é maior que seus filhos

12/09/16 11

min heap max heap

1

3

7

2

3617 19

10025

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 12: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

O que é um heap (binário)

Árvore binária completa

Min heap: Cada nó é menor que seus filhos

Max heap: Cada nó é maior que seus filhos

12/09/16 12

min heap max heap

1

3

7

2

3617 19

10025

100

36

1

19

2517 3

72

Page 13: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Inserir um elemento

Insira o elemento no final do heap e

faça-o ”subir” até a posição correta

12/09/16 13© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 14: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Exemplo de inserção

12/09/16 14

11

85

3 4

15

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 15: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Exemplo de inserção

12/09/16 15

11

85

3 4

15 11

85

3 4

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 16: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Exemplo de inserção

12/09/16 16

11

85

153 4

11

85

3 4

15 11

85

3 4

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 17: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Exemplo de inserção

12/09/16 17

11

85

153 4

11

155

83 4

11

85

3 4

15 11

85

3 4

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 18: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Exemplo de inserção

12/09/16 18

11

85

153 4

11

155

83 4

15

115

83 4

11

85

3 4

15 11

85

3 4

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 19: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Inserir um elemento

1. Insira o elemento no final do heap

2. Compare ele com seu pai: a. Se estiver em ordem, a inserção terminou.

b. Se não estiver, troque com o pai e repita o passo 2 até

terminar ou chegar à raiz.

12/09/16 19© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 20: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Remoção

Retira-se sempre a raiz

Coloque na raiz o último elemento e faça-o ”descer” até

a posição correta

12/09/16 20© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 21: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Exemplo de remoção

12/09/16 21

11

85

3 4

11

85

3 4

85

3 4

4

85

3

4

85

3

8

45

3

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 22: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Remoção (do topo)

1. Coloque na raiz o último elemento

2. Compare ele com seus filhos: a. Se estiver em ordem, a remoção terminou.

b. Se não estiver, troque com o maior filho e repita o passo 2

até terminar ou chegar numa folha.

12/09/16 22© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 23: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Complexidade

12/09/16 23

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)

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 24: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Implementando heaps

12/09/16 24© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 25: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Implementando árvores com vetores

Podemos representar uma árvore binária como um vetor

nó filho esquerdo de i : 2*i +1

nó filho direito de i : 2*i + 2

nó pai de i : (i-1)/2

12/09/16 25

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

nó a b c d e - f - g - h ...

nível 0 1 2 3

a

c

f

b

d e

hg

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 26: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Implementando árvores com vetores

Podemos representar uma árvore binária como um vetor

nó filho esquerdo de i : 2*i +1

nó filho direito de i : 2*i + 2

nó pai de i : (i-1)/2

12/09/16 26

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

nó a b c d e - f - g - h ...

nível 0 1 2 3

a

c

f

b

d e

hg

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

...mas podemos ter bastante memória desperdiçada no caso geral!

Para armazenar uma árvore de altura h precisamos de um vetor de 2(h+1)–1 (número de nós de uma árvore cheia de altura h).

Page 27: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Implementando heap com vetor• no caso de heaps, as árvores são completas!

12/09/16 27

Os n nós da árvore estão nas n primeiras posições do vetor.

í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

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 28: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Implementando heap com vetorDado um nó armazenado no índice i, é possível computar o índice:

do nó filho esquerdo de i : 2*i +1

do nó filho direito de i : 2*i + 2

do nó pai de i : (i-1)/2

Para armazenar uma árvore de altura h precisamos de um vetor de 2(h+1)–1 (número de nós de uma árvore cheia de altura h).

28

Os n nós da árvore estão nas n primeiras posições do vetor.

í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

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 29: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Implementação de um módulo Heap

typedef struct _heap Heap;

Heap* heap_cria(int max);

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

dados * heap_remove(Heap* heap);

12/09/16 29© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 30: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Implementação de um módulo Heap

struct _heap {

int max; /* tamanho maximo do heap */

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

int* prioridade; /* vetor das prioridades */

}; /* estou ignorando os dados! */

Heap* heap_cria(int max){

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

heap->max=max;

heap->pos=0;

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

return heap;

}

12/09/16 30© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 31: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Insere

12/09/16 31

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");

}

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 32: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Insere

12/09/16 32© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 33: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Insere

12/09/16 33

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) {

while (pos > 0){

int pai = (pos-1)/2;

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

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

else

break;

pos=pai;

}

}

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 34: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Remove

12/09/16 34

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);

return topo;

}

else {

printf("Heap VAZIO!");

return -1;

}

}

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 35: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Removestatic void corrige_abaixo(Heap* heap){

int pai=0;

while (2*pai+1 < heap->pos){

int filho_esq=2*pai+1;

int filho_dir=2*pai+2;

int filho;

if (filho_dir >= heap->pos) filho_dir=filho_esq;

if (heap->prioridade[filho_esq]>heap->prioridade[filho_dir])

filho=filho_esq;

else

filho=filho_dir;

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

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

else

break;

pai=filho;

}

}12/09/16 35© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 36: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Construção de Heap

Algoritmo ingênuo:Insira um-a-um todos os n elementos.

Cada elemento é inserido na base e sobe até seu lugar.

Complexidade: O(n log n)

12/09/16 36© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 37: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Construção de Heap

Observe que:As folhas da árvore (elementos n/2 + 1 ... n) não têm

descendentes e portanto já estão ordenadas em relação a

eles

Se acertarmos todos os nós internos (elementos 1 ... n/2)

em relação a seus descendentes, o heap estará pronto

É preciso trabalhar de trás para frente, desde n/2 até 1, pois as

propriedades da heap estão corretas apenas nos níveis mais

baixos.

12/09/16 37© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 38: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

construção de um min heap

lista de 11 prioridades: 21, 19, 16, 22, 17,

20, 23, 12, 34, 15, 60

Page 39: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

construção de um min heap

lista de 11 prioridades: 21, 19, 16, 22, 17,

20, 23, 12, 34, 15, 60

insere-se n/2+1 elementos nas últimas

posições

Page 40: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Construção de Min Heap (exemplo)

falta inserir: 23, 12, 34, 15, 60)

12/09/16 40

1921

202216 17

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 41: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Construção de Min Heap (exemplo)Para i, desde n/2-1, decrementando até 0:

(elementos a serem inseridos: 23, 12, 34, 15, 60)

12/09/16 41

1921

202216 17

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 42: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Construção de Min Heap (exemplo)Para i, desde n/2-1, decrementando até 0:

(elementos a serem inseridos: 23, 12, 34, 15, 60)

12/09/16 42

192123

202216 17

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 43: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Construção de Min Heap (exemplo)Para i, desde n/2-1, decrementando até 0:

(elementos a serem inseridos: 23, 12, 34, 15, 60)

12/09/16 43

192117

202216 23

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 44: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Construção de Min Heap (exemplo)Para i, desde n/2-1, decrementando até 0:

(elementos a serem inseridos: 23, 12, 34, 15, 60)

12/09/16 44

192112 17

202216 23

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 45: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Construção de Min Heap (exemplo)Para i, desde n/2-1, decrementando até 0:

(elementos a serem inseridos: 23, 12, 34, 15, 60)

12/09/16 45

34

192112 17

202216 23

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 46: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Construção de Min Heap (exemplo)Para i, desde n/2-1, decrementando até 0:

(elementos a serem inseridos: 23, 12, 34, 15, 60)

12/09/16 46

19

342112 17

202216 23

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 47: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Construção de Min Heap (exemplo)Para i, desde n/2-1, decrementando até 0:

(elementos a serem inseridos: 23, 12, 34, 15, 60)

12/09/16 47

19

34

15

2112 17

202216 23

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 48: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Construção de Min Heap (exemplo)Para i, desde n/2-1, decrementando até 0:

(elementos a serem inseridos: 23, 12, 34, 15, 60)

12/09/16 48

19

34

12

2115 17

202216 23

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 49: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Construção de Min Heap (exemplo)Para i, desde n/2-1, decrementando até 0:

(elementos a serem inseridos: 23, 12, 34, 15, 60)

12/09/16 49

60

19

34

12

2115 17

202216 23

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 50: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Construção de Min Heap (exemplo)Para i, desde n/2-1, decrementando até 0:

(elementos a serem inseridos: 23, 12, 34, 15, 60)

12/09/16 50

12

19

34

60

2115 17

202216 23

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 51: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Construção de Min Heap (exemplo)Para i, desde n/2-1, decrementando até 0:

(elementos a serem inseridos: 23, 12, 34, 15, 60)

12/09/16 51

12

19

34

15

2160 17

202216 23

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 52: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Construção de Min Heap (exemplo)Para i, desde n/2-1, decrementando até 0:

(elementos a serem inseridos: 23, 12, 34, 15, 60)

12/09/16 52

12

19

34

15

2116 17

202260 23

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 53: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Complexidade do algoritmo de construção de Heap

Suponhamos que a árvore seja cheia. Então: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:

12/09/16 53

)1(2...)2(2)1(2)(1 12 −++−+−+= hhhhS

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 54: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

Complexidade do algoritmo de construção de Heap

12/09/16 54

)1(2...)2(2)1(2)(1 12 −++−+−+= hhhhS)1(2...)2(2)1(2)(22 32 hhhhS ++−+−+=

2S −S = −1(h)+ 2+ 22 + ...+ 2h−1+2h

S = −h+ 2i

i=0

h∑ = −h+ (1− 2

h+1)(1− 2)

= −h+ (2h+1−1) = −h+n

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

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

Page 55: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

heapsort

1014 2 23 302518

colocar em ordem crescente....

Page 56: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

HeapSort

Ordenação de vetor utilizando um heap:1. Construa o heap (complexidade O(n))

2. Para todos os elementos do heap (complexidade O(nlog(n)))

a. Remova o elemento topo (acertando o heap)

b. Salve este elemento no vetor de heap, logo após o último elemento

12/09/16 56© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 57: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

heapsort

1014 2 23 302518

Page 58: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

ordenação do vetor

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

Page 59: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

HeapSort

Construção intuitiva:

• À medida que os elementos vão sendo colocados no final, o heap vai diminuindo de tamanho

• Ao final, o vetor está em ordem decrescente

12/09/16 59© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Page 60: INF 1010 Estruturas de Dados Avançadasnoemi/eda-16.2/heapprio.pdf · Se acertarmostodos os nós internos (elementos1 ... n/2) em relaçãoa seus descendentes, o heap estarápronto

HeapSortOrdenação de vetor utilizando um heap:

1. Construa o heap (complexidade O(n))

2. Para todos os elementos do heap (complexidade O(nlog(n)))

a. Remova o elemento topo (acertando o heap)

b. Salve este elemento no vetor de heap, logo após o último elemento

Construção intuitiva:

• À medida que os elementos vão sendo colocados no final, o heap vai diminuindo de tamanho

• Ao final, o vetor está em ordem decrescente

Para obter ordem crescente:

• inverta a ordem do vetor (complexidade O(n)), ou

• utilize um heap onde a raiz é o maior de todos os elementos

12/09/16 60© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1