Aula 29: Manipulação de listas de prioridadesfabio/Aula-heaps-2.pdf · Inserção em lista de...
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.