Você está na página 1de 10

Listas de Prioridade

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

Insero de um novo elemento no Heap.


Soluo: inserir no final e executar SOBEHEAP.

Insero de um novo elemento no Heap.


Soluo: inserir no final e executar SOBEHEAP.

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

Deleo do elemento de maior prioridade no Heap.


Soluo: substituir o primeiro pelo ltimo, eliminar no final e executar DESCEHEAP.

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

Quando (n + 1) potncia de 2, temos 2h = (n + 1) NC = (n + 1)(log2(n+1) - 2) + 2 = (n + 1)log2(n+1) - 2n = O(n log n)

3
5 10

1
7

17
9

Listas de Prioridade

Deleo do elemento de maior prioridade no Heap.


Soluo: substituir o primeiro pelo ltimo, eliminar no final e executar DESCEHEAP.

Heaps

Deleo do elemento de maior prioridade no Heap.


Soluo: substituir o primeiro pelo ltimo, eliminar no final e executar DESCEHEAP.

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

Deleo do elemento de maior prioridade no Heap.


Soluo: substituir o primeiro pelo ltimo, eliminar no final e executar DESCEHEAP.

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;

Retirada do elemento de maior prioridade:


Substituio pelo ltimo elemento + DESCEHEAP.

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

Exerccio: Ordenar o MIXTRING (10 letras) usando Heapsort.

Estabilidade (manuteno da ordem relativa de chaves iguais): Algoritmo no estvel Memria adicional: Nenhuma Usos especiais: Algoritmo de uso geral

Listas de Prioridade

FIM