• Nenhum resultado encontrado

09-ListasPrioridade

N/A
N/A
Protected

Academic year: 2021

Share "09-ListasPrioridade"

Copied!
64
0
0

Texto

(1)

Listas de Prioridade

Fonte de consulta: Szwarcfiter, J.; Markezon, L. Estruturas de Dados e seus Algoritmos, 3a. ed. LTC. Capítulo 6

(2)

Prioridade

} Algumas aplicações precisam recuperar rapidamente um dado de maior prioridade

} Exemplo: lista de tarefas

} A cada momento, deve-se executar a tarefa que tem mais

prioridade

} Selecionar a tarefa mais prioritária de uma lista e retirá-la da

lista

} Prioridades podem mudar

} Novas tarefas podem chegar e precisam ser acomodadas

(3)

Lista de Prioridades

} Tabela onde cada registro está associado a uma prioridade

} Prioridade: valor numérico armazenado em um dos campos do registro

} Operações sobre listas de prioridade:

} Seleção do elemento de maior prioridade } Inserção de novo elemento

} Remoção do elemento de maior prioridade

(4)

Implementação de Listas de Prioridade

} Lista não ordenada } Lista ordenada

} Heap

(5)

Implementação de Listas de Prioridade

} Lista não ordenada } Lista ordenada

(6)

Implementação por Lista Não Ordenada

} Inserção e Construção: elementos (registros) podem ser colocados na tabela em qualquer ordem

} Remoção: implica em percorrer a tabela

sequencialmente em busca do elemento de maior prioridade

} Alteração: não implica em mudança na estrutura da tabela, mas exige busca do elemento a ser alterado } Seleção: idem à Alteração

(7)

Complexidade

} Para uma tabela com n elementos

} Seleção: O(n) } Inserção: O(1) } Remoção: O(n) } Alteração: O(n) } Construção: O(n)

(8)

Implementação de Listas de Prioridade

} Lista não ordenada } Lista ordenada } Heap

(9)

Implementação por Lista Ordenada

} Remoção e Seleção: imediata, pois elemento de maior prioridade é o primeiro da tabela

} Inserção: exige percorrer a tabela para encontrar a posição correta de inserção

} Alteração: semelhante a uma nova inserção } Construção: exige ordenação prévia da tabela

(10)

Complexidade

} Para uma tabela com n elementos

} Seleção: O(1) } Inserção: O(n) } Remoção: O(1) } Alteração: O(n)

} Construção: O(n log n) (complexidade da ordenação)

(11)

Implementação de Listas de Prioridade

} Lista não ordenada } Lista ordenada

(12)

Implementação por Heap

} Mais eficiente na atualização do que as alternativas anteriores

(13)

Heap

} Lista linear composta de elementos com chaves s1, ..., sn, tal que si ≤ si/2 para 1 < i ≤ n

} Chaves representam as prioridades

} Não existem dois elementos com a mesma prioridade

} Exemplo

(14)

Heap

} Lista linear composta de elementos com chaves s1, ..., sn, tal que si ≤ si/2 para 1 < i ≤ n

} Chaves representam as prioridades

} Não existem dois elementos com a mesma prioridade

} Exemplo 95 60 78 39 28 66 70 33 14 95 60 78 39 33 28 66 70 Lista representada como uma árvore

(15)

Montagem da Árvore Binária

} Nós são numerados sequencialmente, da raiz para os níveis mais baixos, da esquerda para a direita

95 60 78 39 28 66 70 33 95

60 78

39

33

(16)

Montagem da Árvore Binária

} Nós são numerados sequencialmente, da raiz para os níveis mais baixos, da esquerda para a direita

95 60 78 39 28 66 70 33 16 95 60 78 39 33 28 66 70

(17)

Montagem da Árvore Binária

} Nós são numerados sequencialmente, da raiz para os níveis mais baixos, da esquerda para a direita

95 60 78 39 28 66 70 33 95

60 78

39

33

(18)

Montagem da Árvore Binária

} Nós são numerados sequencialmente, da raiz para os níveis mais baixos, da esquerda para a direita

95 60 78 39 28 66 70 33 18 95 60 78 39 33 28 66 70

(19)

Propriedades

} Cada nó possui prioridade maior do que seus dois filhos } O elemento de maior prioridade é sempre a raiz da

árvore

} A representação em memória pode ser feita usando uma lista linear sequencial (vetor)

95

60 78

39 33

(20)

Complexidade

} Seleção: imediata, pois elemento de maior prioridade é o primeiro da tabela

} Inserção, Alteração e Remoção: podem ser feitos em O(log n) (veremos detalhes mais adiante)

} Construção: pode ser feita em O(n) (melhor que no cenário anterior, que exigia ordenação total)

(21)

Complexidade

} Para uma tabela com n elementos

} Seleção: O(1)

} Inserção: O(log n) } Remoção: O(log n) } Alteração: O(log n) } Construção: O(n)

(22)

Alteração de Prioridade

} Ao alterar a prioridade de um nó, é necessário rearrumar a heap para que ela respeite as prioridades

} Um nó que tem a prioridade aumentada precisa “subir” na

árvore

} Um nó que tem a prioridade diminuída precisa “descer” na

árvore

(23)

Exemplo:

Aumentar a prioridade do nó 6 de 66 para 98

95 60 78 39 33 28 66 70 1 2 3 4 5 6 7 8

(24)

Exemplo:

Aumentar a prioridade do nó 6 de 66 para 98

24 95 60 78 39 33 28 98 70 1 2 3 4 5 6 7 8

Apenas o ramo que vai do nó atualizado até a raiz é afetado – o restante da árvore permanece

(25)

Exemplo:

Aumentar a prioridade do nó 6 de 66 para 98

95 60 78 39 33 28 98 70 1 2 3 4 5 6 7 8

Apenas o ramo que vai do nó atualizado até a raiz é afetado – o restante da árvore permanece

(26)

Exemplo:

Aumentar a prioridade do nó 6 de 66 para 98

26 95 60 78 39 33 28 98 70 1 2 3 4 5 6 7 8

“Subir” elemento alterado na árvore, fazendo trocas com o nó pai, até que a árvore volte a ficar

correta (todo nó pai tem prioridade maior que seus

(27)

Exemplo:

Aumentar a prioridade do nó 6 de 66 para 98

95 60 98 39 33 28 78 70 1 2 3 4 5 6 7 8

“Subir” elemento alterado na árvore, fazendo trocas com o nó pai, até que a árvore volte a ficar

(28)

Exemplo:

Aumentar a prioridade do nó 6 de 66 para 98

28 98 60 95 39 33 28 78 70 1 2 3 4 5 6 7 8

“Subir” elemento alterado na árvore, fazendo trocas com o nó pai, até que a árvore volte a ficar

correta (todo nó pai tem prioridade maior que seus

(29)

Exemplo:

Diminuir a prioridade do nó 1 para 37

95 60 78 39 33 28 66 70 1 2 3 4 5 6 7 8

(30)

Exemplo:

Diminuir a prioridade do nó 1 para 37

30 37 60 78 39 33 28 66 70 1 2 3 4 5 6 7 8

“Descer” elemento alterado na árvore, fazendo trocas com o

nó filho de maior prioridade,

até que a árvore volte a ficar correta

(31)

Exemplo:

Diminuir a prioridade do nó 1 para 37

78 60 37 39 33 28 66 70 1 2 3 4 5 6 7 8

“Descer” elemento alterado na árvore, fazendo trocas com o

(32)

Exemplo:

Diminuir a prioridade do nó 1 para 37

32 78 60 70 39 33 28 66 37 1 2 3 4 5 6 7 8

“Descer” elemento alterado na árvore, fazendo trocas com o

nó filho de maior prioridade,

até que a árvore volte a ficar correta

(33)

Algoritmo

Subir por um caminho da árvore

/* i indica a posição do elemento a ser revisto campo chave armazena a prioridade do nó A tabela está armazenada em T

Notação T[i] <-> T[j] representa a troca de posição entre os nós i e j na tabela

*/

procedimento subir(i)

j := floor(i/2) //arredonda o valor da divisão para baixo

se j ≥ 1 então

se T[i].chave > T[j].chave então T[i] <-> T[j]

(34)

Algoritmo

Descer por um caminho da árvore

/* i indica a posição do elemento a ser revisto n é o número de elementos da tabela

campo chave armazena a prioridade do nó A tabela está armazenada em T

Notação T[i] <-> T[j] representa a troca de posição entre os nós i e j na tabela

*/

procedimento descer(i, n) j := 2 * i

se j ≤ n então se j < n então

se T[j+1].chave > T[j].chave então j := j + 1

se T[i].chave < T[j].chave então T[i] <-> T[j] descer(j, n) 34 37 60 78 39 33 28 66 70 1 2 3 4 5 6 7 8

(35)

Inserção

} Tabela com n elementos

} Inserir novo elemento na posição n+1 da tabela } Assumir que esse elemento já existia e teve sua

prioridade aumentada

} Executar algoritmo de subida na árvore para corrigir a prioridade e colocar o novo elemento na posição correta

(36)

Exemplo:

Inserir elemento 73 36 95 60 78 39 33 28 66 70 1 2 3 4 5 6 7 8 95 60 78 39 28 66 70 33

(37)

Exemplo:

Inserir elemento 73 95 60 78 39 33 28 66 70 1 2 3 4 5 6 7 8 73 9 95 60 78 39 28 66 70 33 73

(38)

Exemplo:

Inserir elemento 73 38 95 60 78 73 33 28 66 70 1 2 3 4 5 6 7 8 39 9 95 60 78 73 28 66 70 33 39

(39)

Exemplo:

Inserir elemento 73 95 73 78 60 33 28 66 70 1 2 3 4 5 6 7 8 39 9 95 73 78 60 28 66 70 33 39

(40)

Exemplo:

Inserir elemento 73 40 95 73 78 60 33 28 66 70 1 2 3 4 5 6 7 8 39 9 95 73 78 60 28 66 70 33 39

(41)

Algoritmo

Inserção em Lista de Prioridade

/* n é o número de elementos da tabela novo é o novo elemento a ser inserido */

procedimento inserir(n, novo) T[n+1] := novo

n := n + 1 subir(n)

(42)

Remoção do Elemento mais Prioritário

} Remover o primeiro elemento da tabela

} Preencher o espaço vazio deixado por ele com o último elemento da tabela

} Executar o algoritmo de descida na árvore para corrigir a prioridade desse elemento

(43)

Exemplo

Remover Elemento mais Prioritário

95 60 78 39 33 28 66 70 1 2 3 4 5 6 7 8 95 60 78 39 28 66 70 33

(44)

Exemplo

Remover Elemento mais Prioritário

44 60 78 39 33 28 66 70 1 2 3 4 5 6 7 8 60 78 39 28 66 70 33

(45)

Exemplo

Remover Elemento mais Prioritário

33 60 78 39 28 66 70 1 2 3 4 5 6 7 33 60 78 39 28 66 70

(46)

Exemplo

Remover Elemento mais Prioritário

46 78 60 33 39 28 66 70 1 2 3 4 5 6 7 78 60 33 39 28 66 70

(47)

Exemplo

Remover Elemento mais Prioritário

78 60 70 39 28 66 33 1 2 3 4 5 6 7 78 60 70 39 28 66 33

(48)

Algoritmo

Remoção em Lista de Prioridade

/* n é o número de elementos da tabela

agir implementa quaisquer operações que a aplicação precise realizar com o elemento mais prioritário */ procedimento remover( ) agir(T[1]) T[1] := T[n] n := n - 1 descer(1, n) 48

(49)

Construção de Lista de Prioridades

} Dada uma lista L de elementos para a qual se deseja construir uma heap H, há duas alternativas

1) Considerar uma heap vazia e ir inserindo os elementos de L um a um em H

2) Considerar que a lista L é uma heap, e corrigir as prioridades.

} Assumir que as prioridades das folhas estão corretas (pois eles

não têm filhos, então satisfazem à propriedade de terem prioridade maior que seus filhos)

(50)

Exemplo

Construção de Heap

} Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95

(51)

Exemplo

Construção de Heap

} Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95 28 33 39 60 95 66 70 78 1 2 3 4 5 6 7 8 28 33 39 60 66 70 78 95

(52)

Exemplo

Construção de Heap

} Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95 52 28 33 39 60 95 66 70 78 1 2 3 4 5 6 7 8 28 33 39 60 66 70 78 95 Acertar prioridade do elemento n/2 até o elemento 1, nessa ordem

(53)

Exemplo

Construção de Heap

} Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95 28 33 39 60 95 66 70 78 1 2 3 4 5 6 7 8 28 33 39 60 66 70 78 95 Acertar prioridade do elemento n/2 até o

(54)

Exemplo

Construção de Heap

} Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95 54 28 33 39 95 60 66 70 78 1 2 3 4 5 6 7 8 28 33 39 95 66 70 78 60 Acertar prioridade do elemento n/2 até o elemento 1, nessa ordem

(55)

Exemplo

Construção de Heap

} Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95 28 33 39 95 60 66 70 78 1 2 3 4 5 6 7 8 28 33 39 95 66 70 78 60 Acertar prioridade do elemento n/2 até o

(56)

Exemplo

Construção de Heap

} Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95 56 28 33 78 95 60 66 70 39 1 2 3 4 5 6 7 8 28 33 78 95 66 70 39 60 Acertar prioridade do elemento n/2 até o elemento 1, nessa ordem

(57)

Exemplo

Construção de Heap

} Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95 28 33 78 95 60 66 70 39 1 2 3 4 5 6 7 8 28 33 78 95 66 70 39 60 Acertar prioridade do elemento n/2 até o

(58)

Exemplo

Construção de Heap

} Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95 58 28 95 78 33 60 66 70 39 1 2 3 4 5 6 7 8 28 95 78 33 66 70 39 60 Acertar prioridade do elemento n/2 até o elemento 1, nessa ordem

(59)

Exemplo

Construção de Heap

} Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95 28 95 78 60 33 66 70 39 1 2 3 4 5 6 7 8 28 95 78 60 66 70 39 33 Acertar prioridade do elemento n/2 até o

(60)

Exemplo

Construção de Heap

} Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95 60 95 28 78 60 33 66 70 39 1 2 3 4 5 6 7 8 95 28 78 60 66 70 39 33 Acertar prioridade do elemento n/2 até o elemento 1, nessa ordem

(61)

Exemplo

Construção de Heap

} Construir uma Heap a partir da lista 28, 33, 39, 60, 66, 70, 78, 95 95 66 78 60 33 28 70 39 1 2 3 4 5 6 7 8 95 66 78 60 28 70 39 33 Acertar prioridade do elemento n/2 até o

(62)

Exercícios

1. Verificar se essas sequências correspondem ou não a um heap 33 32 28 31 26 29 25 30 27 36 32 28 31 29 26 25 30 27 33 32 28 30 29 26 25 31 27 35 31 28 33 29 26 25 30 27 62

(63)

Exercícios

2. Seja o heap especificado a seguir: 92 85 90 47 71 34 20 40 46. Sobre esse heap, realizar as seguintes operações: (a) Inserir os elementos 98, 75, 43

(b) Remover o elemento de maior prioridade (sobre o heap original)

(c) Remover o elemento de maior prioridade (sobre o heap resultante do exercício (b)

(d) Alterar a prioridade do 5º. nó de 71 para 93 (sobre o heap original)

(e) Alterar a prioridade do 5º. nó de 71 para 19 (sobre o heap original)

(64)

Exercícios

3. Construa um heap baseado na seguinte lista: 18 25 41 34 14 10 52 50 48

Usar o método de construção que assume que as folhas estão corretas ao invés de inserir elemento a elemento

Referências

Documentos relacionados

a) Explicite, justificadamente, o comportamento dessa variável nas últimas três décadas, indicando a alteração que esse comportamento implica para a estrutura etária

(FUVEST-2002) As características de uma pilha, do tipo PX, estão apresentadas no quadro a seguir, tal como fornecidas pelo fabricante. Três dessas pilhas foram colocadas para

Móvel c\ manopla e giro 1,20 m Barra Olímpica Cromada Masculina 20kg - 2,20m - 4 Rolamentos Barra Olímpica Cromada 10 kg - 1,62 m - 4 Rolamentoos JUNIOR Barra Olímpica Cromada

Ficha de Segurança contra Incêndios em Edifícios - Técnico autor - Seguro de responsabilidade civil Ficha de Segurança contra Incêndios em Edifícios - Técnico autor - Termo

a) O correspondente posto de trabalho tem de estar previsto no mapa de pessoal do município. b) O cargo será exercido em comissão de serviço por períodos de 3 anos, sem prejuízo

acórdão recorrido, absolve-se o réu dos pedidos de anulação e de resolução da doação em causa, mas, pelo incumprimento (parcial) do mesmo contrato, vai o réu condenado a pagar

O presente trabalho pretende estudar e analisar o funcionamento do sistema de ventilação de um edifício de habitação, nomeadamente avaliar a estanquidade com recurso ao

originada pela alteração nos créditos), 4) mudança no programa (Justificativa: alteração 183. necessária originada pela alteração nos créditos), 5) alteração da