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

Post on 07-Aug-2020

0 views 0 download

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

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

29.2

Operações básicas

Descrever métodos para as operações de

inserção

remoção

construção

em listas de prioridades

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.

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

29.5

Inserção em lista de prioridades

ou

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.

29.7

Inserção e aumentode prioridades

Exemplo:

Inserir nó com prioridade 73

95

60 78

39 28 66 70

33

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

29.9

Inserção e aumentode prioridades

95

73 78

60 28 66 70

33 39

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

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)

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

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

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

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.

29.16

Remoção e diminuiçãode prioridades

Exemplo

Remover elemento demaior prioridade

95

73 78

60 28 66 70

33 39

29.17

Remoção e diminuiçãode prioridades

78

73 39

60 28 66 70

33

39

73 78

60 28 66 70

33

29.18

Remoção e diminuiçãode prioridades

78

73 70

60 28 66 39

33

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

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

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

29.22

Algoritmo de remoção

32

27 28

31 29 26 25

30

32

31 28

27 29 26 25

30

29.23

Algoritmo de remoção

32

31 28

30 29 26 25

27

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)

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)

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

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

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

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

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

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.

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)

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.

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.

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.

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

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

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

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

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

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

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.