Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de...

42
29.1 Aula 29: Manipulação de listas de prioridades Remoção em listas de prioridades Inserção em listas de prioridades Construção de listas de prioridades e ordenação

Transcript of Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de...

Page 1: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.1

Aula 29: Manipulação delistas de prioridades

Remoção em listas de prioridades

Inserção em listas de prioridades

Construção de listas de prioridades e ordenação

Page 2: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.2

Operações básicas

Descrever métodos para as operações de

inserção

remoção

construção

em listas de prioridades

Page 3: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.3

Inserção em lista de prioridades

Inserir v, ao final do heap. Isto é, na posição n+1.

Seja v o nó a ser inserido, com uma dadaprioridade, num heap com n nós.

Na árvore completa T, equivalente ao heap, casoT seja cheia, o nó v será incluído como o filhomais à esquerda da folha mais à esquerda de T.Caso contrário, v se transformará em uma novafolha, imediatamente à direita da folha mais àdireita de T.

Page 4: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.4

Inserção em lista de prioridades

s1 sn

1 n

s1 sn sn+1

1 n n+1

v = sn+1

cheia

v

Page 5: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.5

Inserção em lista de prioridades

ou

Page 6: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.6

Inserção e aumentode prioridades

Após a inserção de v na posição n+1, é necessário verificar se a condição das prioridades do heap continua válida.

Em caso negativo, é necessário efetuar umareordenação.

Para tal, basta supor que o elemento n+1 do heapteve sua prioridade aumentada. Nesse caso, asolução é utilizar o procedimento de aumento deprioridade.

Page 7: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.7

Inserção e aumentode prioridades

Exemplo:

Inserir nó com prioridade 73

95

60 78

39 28 66 70

33

Page 8: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.8

Inserção e aumentode prioridades

95

60 78

39 28 66 70

33 73

95

60 78

73 28 66 70

33 39

Page 9: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.9

Inserção e aumentode prioridades

95

73 78

60 28 66 70

33 39

Page 10: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.10

Algoritmo de inserção

Algoritmo: inserção em uma lista de prioridades

se n < M então

T [n+1] := novo n := n+1 subir (n)senão overflow

Page 11: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.11

Algoritmo de inserção

M é o tamanho total da memória disponível

O heap está armazenado na tabela T

A variável novo representa o nó a ser inserido

Complexidade: O (log n)

Page 12: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.12

Algoritmo de inserção

Inserir um novo nó, com prioridade igual a 22no heap

33 32 28 31 29 26 25 30 27

Exercício

Tempo: 1 minuto

Page 13: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.13

Algoritmo de inserção

Solução

33

32 28

31 29 26 25

30 27

33

32 28

31 29 26 25

30 27 22

Page 14: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.14

Remoção em listasde prioridades

Remover o nó de maior prioridade, isto é, oprimeiro nó do heap.

Após a remoção, mover o último nó para aposição 1. A lista torna-se de tamanho n-1.

s1 sn

1 n

s2 sn-1

2 n-1

sn

1 n-1 n

s2 sn-1

2

sn sn-1

1 n-1 n

s2

2

Page 15: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.15

Remoção e diminuiçãode prioridades

Após a remoção do nó de prioridade maior e amudança do último elemento para a posição 1, énecessário verificar se a condição das prioridadesdos heaps continua válida.

Em caso negativo, é necessário efetuar umareordenação.

Para tal, basta supor que o elemento 1 do heapteve a sua prioridade diminuida. Nesse caso, asolução é utilizar o procedimento de diminuiçãode prioridade.

Page 16: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.16

Remoção e diminuiçãode prioridades

Exemplo

Remover elemento demaior prioridade

95

73 78

60 28 66 70

33 39

Page 17: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.17

Remoção e diminuiçãode prioridades

78

73 39

60 28 66 70

33

39

73 78

60 28 66 70

33

Page 18: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.18

Remoção e diminuiçãode prioridades

78

73 70

60 28 66 39

33

Page 19: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.19

Algoritmo de remoção

Algoritmo: remoção do elemento de maiorprioridade

O heap está armazenado na tabela T.

O procedimento agir consiste na utilização doelemento de maior prioridade, de acordo com aaplicação.

Complexidade: O (log n)

se n ≠0 então agir (T[1]) T [1] := T [n] n := n-1 descer (1, n)senão underflow

Page 20: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.20

Algoritmo de remoção

Remover o elemento de maior prioridade do heap

33 32 28 31 29 26 25 30 27

Exercício

Tempo: 2 minutos

Page 21: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.21

Algoritmo de remoção

Solução

33

32 28

31 29 26 25

30 27

27

32 28

31 29 26 25

30

Page 22: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.22

Algoritmo de remoção

32

27 28

31 29 26 25

30

32

31 28

27 29 26 25

30

Page 23: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.23

Algoritmo de remoção

32

31 28

30 29 26 25

27

Page 24: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.24

Construção de um heap

Objetivo: Descrever métodos para construirheaps.

Solução 1:

Uma lista ordenada constitui um heap.Logo, um heap pode ser construído, simplesmente,ordenando-se uma lista.

Complexidade: O (n log n)

Page 25: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.25

Construção de um heap

Solução 2:

Seja S uma lista dada, para a qual se desejaconstruir um heap. Para que S seja um heap,basta corrigir a posição de seus nós, isto é, consi-derar cada um de seus nós, como sendo uma novainserção.

Algoritmo: Construção de um heappara i = 2, ..., n faça subir (i)

Complexidade: O (n log n)

Page 26: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.26

Construção de um heap

Seja uma lista dada pelas prioridades a seguir:

18 25 41 34 14 10 52 50 48

Construir um heap para esta lista, utilizando o algoritmo da solução 2.

Exercício

Tempo: 8 minutos

Page 27: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.27

Construção de um heap

Solução

i 1 2 3 4 5 6 7 8 9 18 25 41 34 14 10 52 50 48

i=1

18 18

25

25

18

i=2

25

18 41

41

18 25

i=3

Page 28: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.28

Construção de um heap

41

18 25

34

41

34 25

18

i=4

41

34 25

18 14

i=5

41

34 25

18 14 10

i=6

Page 29: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.29

Construção de um heap

41

34 25

18 14 10 52

52

34 41

18 14 10 25

i=7

52

34 41

18 14 10 25

50i=8

Page 30: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.30

Construção de um heap

i=9

52

50 41

34 14 10 25

18

52

50 41

34 14 10 25

18 48

52

50 41

48 14 10 25

18 34

Page 31: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.31

Construção de um heap

Solução 3:

A propriedade das prioridades dos heaps ésempre, trivialmente, satisfeita pelas folhas.No caso, pelos nós alocados a partir da posição n/2 + 1.

Assim, na construção dos heaps, os únicos nós relevantes, sob o ponto de vista de análise, sãoos nós interiores. Estes devem ter suasprioridades verificadas e acertadas, a partirdos níveis mais baixos da árvore.

Page 32: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.32

Construção de um heap

Algoritmo: Construção de heaps

Complexidade: O (n)

procedimento arranjar (n) para i = n/2 , ..., 1 faça descer (i, n)

Page 33: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.33

Aplicação: ordenação por heaps

Construir um heap para T, tomando-se a priori-dade igual à chave de ordenação desejada.

Seja T uma lista que se deseja ordenar.

Iterativamente, remover o elemento de maior prioridade e corrigir o heap.

O método acima produzirá a ordenação da listaem ordem não decrescente de suas chaves deordenação.

Page 34: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.34

Algoritmo de ordenação

Algoritmo: Ordenação de uma lista T

arranjar ( n )m := nenquanto m > 1 faça T [1] ⇔ T [m] m := m - 1 descer ( 1, m )

Complexidade: O (n log n)

A notação T [1] ⇔ T [m] significa a troca deposição em T, entre T [1] e T [m].

O procedimento arranjar (n) constrói um heappara T, segundo a solução 3.

Page 35: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.35

Algoritmo de ordenação

Exemplo

Seja a lista: 40 37 95 42 23 51 27

O método da ordenação por heaps, aplicado a estalista, corresponderá às seguintes operações.

Page 36: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.36

Algoritmo de ordenação

27

42 51

2337 9540

trocar(TB[1],TB[7]) m = 6

descer(1,6)

51

42 40

2337 9527

Page 37: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.37

Algoritmo de ordenação

trocar(TB[1],TB[6]) m = 5

descer(1,5)

27

42 40

2337 9551

42

37 40

2327 9551

Page 38: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.38

Algoritmo de ordenação

trocar(TB[1],TB[5]) m = 4

descer(1,4)

23

37 40

4227 9551

40

37 23

4227 9551

Page 39: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.39

Algoritmo de ordenação

trocar(TB[1],TB[4]) m = 3

descer(1,3)

27

37 23

4240 9551

37

27 23

4240 9551

Page 40: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.40

Algoritmo de ordenação

trocar(TB[1],TB[3]) m = 2

descer(1,2)

23

27 37

4240 9551

27

23 37

4240 9551

Page 41: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.41

Algoritmo de ordenação

trocar(TB[1],TB[2]) m = 1

descer(1,1)

23

27 37

4240 9551

23

27 37

4240 9551

Page 42: Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de prioridades Inserir v, ao final do heap. Isto é, na posição n+1. Seja v o nó a

29.42

Algoritmo de ordenação

Exercício Final

Provar que o algoritmo da solução 3, para aconstrução de um heap, termina em O (n) passos.