Professional Documents
Culture Documents
Listas de Prioridade
Notas de aula da disciplina IME 04-10820 ESTRUTURAS DE DADOS I Paulo Eustquio Duarte Pinto (pauloedp arroba ime.uerj.br)
Em algumas situaes, necessrio manter um conjunto dinmico de chaves, tal que a principal operao no conjunto a retirada do elemento de maior prioridade (chave). A manuteno do conjunto ordenado uma soluo para o problema, mas o uso das listas de prioridade fornece uma soluo mais simples. Ex: seleo de jobs. Listas de prioridade so estruturas de dados para as quais se tem operaes eficientes para:
fevereiro/2011
-Seleo do elemento de maior prioridade - O(1) -Insero/deleo de elementos -O(log n) -Mudanas de prioridade -O(log n)
Listas de Prioridade
Listas de Prioridade
Heaps
Heaps implementam listas de prioridade. Um Heap uma rvore binria (virtual!), onde a chave de cada n () que a dos descendentes. Exemplo:
Um Heap um vetor que pode ser visto como uma rvore binria (virtual!). A raiz a clula 1 e os filhos do n i esto nas clulas 2i e 2i+1, se existirem.
Heaps
Exemplo:
1 2 3 4 5 6 7 50 28 17 18 3 17 1
8 9 10 1 17 2
50 28 17 3 2 17 1 1
8
50 28 18
4 2 1
17 17
6 3
18 1 17
3
5
1
7
17
9
2
10
Heaps
Exemplo:
Listas de Prioridade
Heaps
8 9 10 11 1 17 2 29 Exemplo:
Listas de Prioridade
1 2 3 4 5 6 7 50 28 17 18 3 17 1
1 2 3 4 5 6 7 50 29 17 18 28 17 1
8 9 10 11 1 17 2 3
50 29 28 18 1
8 4 2 1
50 17
3
29 1
7
17 17
3
3
5
29 17 28 29 3
11 6
18 1
8 4
28
5
1
7
17
9
2
10
17
9
2
10
3
11
Listas de Prioridade
Listas de Prioridade
Heaps
Insero de um novo elemento no Heap SOBEHEAP. SobeHeap(k): t V[k]; V[0] t; Enquanto (V[k/2] < t): V[k] V[k/2]; k k/2; Fe; V[k] t; Fim;
Heaps
Criao de um Heap a partir de um vetor j preenchido, usando SOBEHEAP. CriaHeap: Para i de 2 a n: SobeHeap(i); Fp; Fim; Complexidade: O(n log n)
Listas de Prioridade
Listas de Prioridade
Heaps
Criao de um Heap a partir de um vetor j preenchido, usando SOBEHEAP. Exemplo: 1 2 3 4 5 6 7 8 9 10 1 28 17 18 2 17 1 17 50 3 Exemplo:
Heaps
Criao de um Heap a partir de um vetor j preenchido, usando SOBEHEAP. 1 2 3 4 28 18 17 1 5 6 7 8 9 10 2 17 1 17 50 3
1 28 1
28 1 18
28 17 1 17 18
28 17 2 17 1
Listas de Prioridade
Listas de Prioridade
Heaps
Criao de um Heap a partir de um vetor j preenchido, usando SOBEHEAP. Exemplo: 1 2 3 4 5 6 7 28 18 17 17 2 17 1 8 9 10 1 50 3 Exemplo:
Heaps
Criao de um Heap a partir de um vetor j preenchido, usando SOBEHEAP. 1 2 3 4 5 6 7 50 28 17 18 2 17 1 8 9 10 1 17 3
28 18 17 1 50 2 17 17 1 1 18 17 3 28 2
50 17 17 1
Listas de Prioridade
Listas de Prioridade
Heaps
Criao de um Heap a partir de um vetor j preenchido, usando SOBEHEAP. Exemplo: 1 2 3 4 5 6 7 50 28 17 18 3 17 1 8 9 10 1 17 2
Heaps
Criao de um Heap a partir de um vetor j preenchido, usando SOBEHEAP. Exerccio: Criar um Heap a partir do vetor preenchido com o MIXTRING (10 letras) usando SobeHeap
50 28 18 1 17 2 3 17 17 1
Listas de Prioridade
Listas de Prioridade
Heaps
Complexidade da criao de um Heap a partir de um vetor j preenchido, usando SOBEHEAP.
NC = 1 i (h -1) i.2i = 1 i (h -1) i j (h -1) 2j j j = 1 i (h -1) (0 j (h -1) 2 - 0 j (i -1) 2 ) h i = 1 i (h -1) (2 -1 - (2 - 1)) h i = 2 1 i (h -1) 1 - 1 i (h -1) 2
=2 h(h
Heaps
Exemplo:
1 2 3 4 5 6 7 50 28 17 18 3 17 1
8 9 10 1 17 2
2 28 18 1
8 4 2
50 2
1
- 1) - (2h - 2) = 2h(h - 2) +2
17 17
6 3
3
5 10
1
7
17
9
Listas de Prioridade
Heaps
Heaps
Listas de Prioridade
Exemplo:
1 2 3 4 5 6 7 2 28 17 18 3 17 1
8 9 1 17
Exemplo:
1 2 3 4 5 6 7 28 2 17 18 3 17 1
8 9 1 17
2 28 18 1
8 4 2 1
28 17 17
6 3
2 1
7
17 17
6 3
3
5
18 1
8 4
3
5
1
7
17
9
17
9
Listas de Prioridade
Heaps
Deleo do elemento de maior prioridade no Heap.
Soluo: substituir o primeiro pelo ltimo, eliminar no final e executar DESCEHEAP.
Heaps
8 9 1 17
Listas de Prioridade
Exemplo:
1 2 3 4 28 18 17 2
5 6 7 3 17 1
Exemplo:
1 2 3 4 5 6 7 28 18 17 17 3 17 1
8 1
9 2
28 18 2 1
8 4 2 1
28 17 17
6 3
18 1
7
17 17
6 3
3
5
17 1
8 4
3
5
1
7
17
9
2
9
Listas de Prioridade
Listas de Prioridade
Heaps
Diminuio da prioridade de um elementoDESCEHEAP.
DesceHeap(k, m): t V[k]; Enquanto (k m/2): j 2*k; Se (j < m) e (V[j] < V[j+1]) Ento j j+1; Se (t V[j]) Ento Parar loop; Seno V[k] V[j]; k j; Fe; V[k] t; Fim;
Heaps
Criao de um Heap a partir de um vetor j preenchido, usando DESCEHEAP. CriaHeap: Para i decrescendo de n/2 at 1: DesceHeap(i, n); Fp; Fim; Complexidade: O(n)!!
Listas de Prioridade
Listas de Prioridade
Heaps
Criao de um Heap a partir de um vetor j preenchido, usando DESCEHEAP. Exemplo: 1 2 3 4 5 6 7 8 9 10 1 28 17 18 2 17 1 17 50 3 Exemplo:
Heaps
Criao de um Heap a partir de um vetor j preenchido, usando DESCEHEAP. 1 2 3 4 5 6 7 8 9 10 1 28 17 18 3 17 1 17 50 2
1 28 18 17 50 3 2 17 17 1 17 18 50 2 28 3
1 17 17 1
Listas de Prioridade
Listas de Prioridade
Heaps
Criao de um Heap a partir de um vetor j preenchido, usando DESCEHEAP. Exemplo: 1 2 3 4 5 6 7 8 9 10 1 28 17 50 3 17 1 17 18 2 Exemplo:
Heaps
Criao de um Heap a partir de um vetor j preenchido, usando DESCEHEAP. 1 2 3 4 5 6 7 8 9 10 1 28 17 50 3 17 1 17 18 2
1 28 50 17 18 2 3 17 17 1 17 50 18 2 28 3
1 17 17 1
Listas de Prioridade
Listas de Prioridade
Heaps
Criao de um Heap a partir de um vetor j preenchido, usando DESCEHEAP. Exemplo: 1 2 3 4 5 6 7 8 9 10 1 50 17 28 3 17 1 17 18 2
Heaps
Criao de um Heap a partir de um vetor j preenchido, usando DESCEHEAP. Exemplo: 1 2 3 4 5 6 7 8 9 10 50 28 17 18 3 17 1 17 1 2
1 50 28 17 18 2 3 17 17 1 17 18 1 2 28 3
50 17 17 1
Listas de Prioridade
Listas de Prioridade
Heaps
Criao de um Heap a partir de um vetor j preenchido, usando DESCEHEAP. Exerccio: Criar um Heap a partir do vetor preenchido com o MIXTRING (10 letras) usando DesceHeap.
Heaps
Complexidade da criao de um Heap a partir de um vetor j preenchido, usando DESCEHEAP.
NC = = = = = = 2 1 i (h -1) 2i-1(h - i) 2( 1 i (h -1) h.2i-1 - 1 i (h -1) i.2i-1) 2(h 1 i (h-1) 2i-1 - (1/2) i1 i (h-1) i.2i) 2(h(2h-1 - 1) - (2h-1 - (h - 2) + 1)) 2(h.2h-1 - h - h.2h-1 - h + 2h - 1) 2(2h - h - 1) = 2h+1 - 2.h - 2
Quando (n + 1) potncia de 2, temos 2h = (n + 1) NC = = = = 2((n+1) - log2(n + 1) - 1) = 2(n+1 - log2(n + 1) - 1) = 2(n - log2(n + 1)) = O(n)
Listas de Prioridade
Listas de Prioridade
Heaps
Operaes em um Heap: Insero:
Insero no final do vetor + SOBEHEAP.
Heapsort
Idia: criar um Heap e, sucessivamente, trocar o primeiro elemento com o ltimo, diminuir o Heap e acert-lo. Heapsort: CriaHeap; Para i decrescendo de n a 2: Troca (1, i); DesceHeap(1, i-1); Fp; Fim;
Modificao de prioridade:
SOBEHEAP ou DESCEHEAP.
Deleo:
Substituio pelo ltimo elemento + Modificao de prioridade.
Listas de Prioridade
Listas de Prioridade
Heapsort
1 2 3 4 5 6 7 8 9 10 1 28 17 18 2 17 1 17 50 3
Heapsort
Passo 1: Criao do Heap. 1 2 3 4 5 6 7 8 9 10 50 28 17 18 3 17 1 17 1 2
Exemplo:
Exemplo:
1 28 18 17 50 3 2 17 17 1 17 18 1 2 28 3
50 17 17 1
Listas de Prioridade
Listas de Prioridade
Heapsort
Passo 2: i = 10 Troca primeiro com ltimo. 1 2 3 4 5 6 7 8 9 10 2 28 17 18 3 17 1 17 1 50
Heapsort
Passo 2: i = 10 DesceHeap (1,9). 1 2 3 4 5 6 7 28 18 17 17 3 17 1 8 2 9 10 1 50
Exemplo:
Exemplo:
2 28 18 17 1 50 3 17 17 1 2 17 1 18 3
28 17 17 1
Listas de Prioridade
Listas de Prioridade
Heapsort
Passo 2: i = 9 Troca primeiro com ltimo. 1 2 3 4 5 6 7 1 18 17 17 3 17 1 8 9 10 2 28 50
Heapsort
Passo 2: i = 9 DesceHeap (1,8). 1 2 3 4 18 17 17 2 5 6 7 3 17 1 8 9 10 1 28 50
Exemplo:
Exemplo:
1 18 17 2 28 3 17 17 1 1 2 17 3
18 17 17 1
Listas de Prioridade
Listas de Prioridade
Heapsort
Passo 2: i = 8 Troca primeiro com ltimo. 1 2 3 4 1 17 17 2 5 6 7 8 9 10 3 17 1 18 28 50
Heapsort
Passo 2: i = 8 DesceHeap (1,7). 1 2 3 4 17 3 17 2 5 6 7 8 9 10 1 17 1 18 28 50
Exemplo:
Exemplo:
1 17 2 18 3 17 17 1 2 3 1
17 17 17 1
Listas de Prioridade
Listas de Prioridade
Heapsort
Passo 2: i = 7 Troca primeiro com ltimo. 1 1 2 3 4 3 17 2 5 6 7 8 9 10 1 17 17 18 28 50
Heapsort
Passo 2: i = 7 DesceHeap (1,6). 1 2 3 4 17 3 17 2 5 1 6 7 8 9 10 1 17 18 28 50
Exemplo:
Exemplo:
1 3 2 1 17 17 17 2 3 1
17 17 1
Listas de Prioridade
Listas de Prioridade
Heapsort
Passo 2: i = 6 Troca primeiro com ltimo. 1 1 2 3 4 3 17 2 5 6 7 8 9 10 1 17 17 18 28 50 1 2 17 3
Heapsort
Passo 2: i = 6 DesceHeap (1,5). 3 4 2 5 6 7 8 9 10 1 17 17 18 28 50
Exemplo:
Exemplo:
1 3 2 1 17 17 2 3 1
17 1
Listas de Prioridade
Listas de Prioridade
Heapsort
Passo 2: i = 5 Troca primeiro com ltimo. 1 1 2 3 3 4 5 6 7 8 9 10 2 17 17 17 18 28 50 1 3 2 2
Heapsort
Passo 2: i = 5 DesceHeap (1,4). 3 1 4 5 6 7 8 9 10 1 17 17 17 18 28 50
Exemplo:
Exemplo:
1 3 2 17 1 1 2
3 1
Listas de Prioridade
Listas de Prioridade
Heapsort
Passo 2: i = 4 Troca primeiro com ltimo. 1 1 2 2 3 1
Heapsort
Passo 2: i = 4 DesceHeap (1,3). 1 2 2 1 3 1
Exemplo:
4 5 6 7 8 9 10 3 17 17 17 18 28 50
Exemplo:
4 5 6 7 8 9 10 3 17 17 17 18 28 50
1 2 3 1 1
2 1
Listas de Prioridade
Listas de Prioridade
Heapsort
Passo 2: i = 3 Troca primeiro com ltimo. 1 1 2 1
Heapsort
Passo 2: i = 3 DesceHeap (1,2). 1 1 2 1
Exemplo:
3 2
4 5 6 7 8 9 10 3 17 17 17 18 28 50
Exemplo:
3 2
4 5 6 7 8 9 10 3 17 17 17 18 28 50
1 1 2 1
Listas de Prioridade
Listas de Prioridade
Heapsort
Passo 2: i = 2 Troca primeiro com ltimo. 1 1
Heapsort
Passo 2: i = 2 DesceHeap (1,1). 1 1
Exemplo:
2 1
3 2
4 5 6 7 8 9 10 3 17 17 17 18 28 50
Exemplo:
2 1
3 2
4 5 6 7 8 9 10 3 17 17 17 18 28 50
1 1
Listas de Prioridade
Listas de Prioridade
Heapsort
HEAPSORT Complexidade: Pior caso: Melhor caso:
Heapsort
Anlise do HEAPSORT: O(n log n) vetor inv. ordenado O(n) chaves iguais
Estabilidade (manuteno da ordem relativa de chaves iguais): Algoritmo no estvel Memria adicional: Nenhuma Usos especiais: Algoritmo de uso geral
Listas de Prioridade
FIM