Nas filas de prioridade, todos os elemento possuem uma chave, que pode ser usada para ordenar a fila
Chave maior (ou menor) pode corresponder a maior prioridade
AED (IST/DEEC) 3
i2
free=3
4
i3 i1
Seja Key(i3)>Key(i2)>Key(i1)
PQdelmax() d:
i2
free=3
AED (IST/DEEC)
i3 i1
free=2
i2 i1
5
A implementao das filas de prioridade por acervos (heaps) permite o melhor equilbrio no desempenho da procura (e remoo) de elementos com maior e com prioridade qualquer.
AED (IST/DEEC)
Remover N 1 lg N
Modificar prioridade N 1 lg N
Juno N N N
AED (IST/DEEC)
Acervos (1)
Definio Um acervo (heap) uma representao, em tabela, de uma rvore que satisfaz a condio de acervo (heap condition) : o valor da chave associada a cada n superior (ou inferior) ao valor das chaves associadas em todos os ns de altura inferior
A ordenao dos acervos parcial (heap-ordering) Vantagens da representao de rvores por tabela
Menor ocupao de memria Acesso constante a qualquer elemento Necessrio conhecer tamanho partida
8
AED (IST/DEEC)
Acervos (2)
Conveno (exemplo): nos acervos, a prioridade maior quanto menor for o nmero.
#define lessPri(A, B) (key(A) > key(B))
(pode ser exactamente o contrrio; uma conveno) A criao de um acervo, a partir de uma rvore, feita percorrendo a rvore em largura (breadht-first). Se rvore no for completa, existem casas vazias: a soluo impor que todos os ns intermdios sejam preenchidos.
AED (IST/DEEC)
Acervos (3)
Exemplo A1: Acervo de 12 posies
3
3
5 7
9 12 16 20 25 22 28 32 40
20
12
16
25 22 28 32 40
Nota! No livro do Sedgewick, os ndices da tabela so considerados a partir de 1, Aqui usamos a conveno do C (a partir de 0)
AED (IST/DEEC) 10
Acervos (4)
Alterao/insero/remoo de um elemento pode quebrar a condio dos acervos.
Exemplo: se a chave for decrementada (valor substitudo por outro maior), os descendentes podem passar a ter chaves maiores (valores menores). Nota: decrementar baixar a prioridade Se a chave for decrementada, verificar ns de alturas inferiores descendo o caminho at folha Se a chave for incrementada, verificar ns de alturas superiores subindo o caminho at raiz
AED (IST/DEEC)
11
AED (IST/DEEC)
12
Acervos (5)
Reposio da ordenao num acervo
A. Se prioridade de um n for aumentada, enquanto no for restabelecida a condio de acervo ou atingida a raiz, trocar com o n ascendente.
void FixUp(Item Heap[], int Idx) { while (Idx > 0 && lessPri(Heap[(Idx-1)/2], Heap[Idx])) { exch(Heap[Idx], Heap[(Idx-1)/2]); Idx = (Idx-1)/2; } }
AED (IST/DEEC)
13
Acervos (6)
Exemplo A2: No exemplo A1, n de prioridade 28 (posio 9) passa a ter prioridade 4
3 5 7
9 12 10 20 25 22 4 32 40
12
10
20
Heap[9]=4, Heap[(9-1)/2]=12
25 22 4 32 40
AED (IST/DEEC)
14
Acervos (7)
3 5 7
4 10 20 25 22 12 32 40
10
20
Heap[4]=4, Heap[(4-1)/2]=5
25 22 12 32 40
AED (IST/DEEC)
15
Acervos (8)
3 4 7
5 10 20 25 22 12 32 40
10
20
Heap[1]=4, Heap[(1-1)/2]=3
25 22 12 32 40
AED (IST/DEEC)
16
Acervos (9)
B. Se prioridade de um n for diminuda, enquanto no restabelecer a condio de acervo ou atingir uma folha, trocar com o maior descendente.
void FixDown(Item Heap[], int Idx, int N) { int Child; /* ndice de um n descendente */ while(2*Idx < N) { /* enquanto no chegar s folhas */ Child = 2*Idx+1; /* selecciona o maior descendente. Nota: se ndice Child N-1, ento s h um descendente */ if (Child < N && lessPri(Heap[Child], Heap[Child+1])) Child++; if (!lessPri(Heap[Idx], Heap[Child])) break; /*condio acervo satisfeita */ exch(Heap[Idx], Heap[Child]); /* continua a descer a rvore */ Idx = Child; }}
Acervos (10)
Exemplo A2: No exemplo A1, n de prioridade 3 (posio 0) passa a ter prioridade 14
14 5 7
14 5
9 12 10 20 25 22 28 32 40
12
10
20
Idx=0, Child=2*0+1=1
25 22 28 32 40
!lessPri(Heap[1],Heap[2]): foca na subrvore esq. lessPri(Heap[0],Heap[1]): troca e chama FixDown sobre a posio 1
AED (IST/DEEC)
18
Acervos (11)
5 14 7
5 14 7
9 12 10 20 25 22 28 32 40
12
10
20
Idx=1, Child=2*1+1=3
25 22 28 32 40
!lessPri(Heap[3],Heap[4]): foca na subrvore esq. lessPri(Heap[1],Heap[3]): troca e chama FixDown sobre a posio 3
AED (IST/DEEC)
19
Acervos (12)
5 9 7
7 14 12 10 20 25 22 28 32 40
14
12
10
20
Idx=3, Child=3*1+1=7
25 22 28 32 40
AED (IST/DEEC)
20
AED (IST/DEEC)
21
AED (IST/DEEC)
22
void PQsort(Item pTable[], int L, int R) { int Aux; PQinit(R-L+1); for(Aux = L; Aux <= R; Aux++) PQinsert(pTable[Aux]); for(Aux = R; Aux >= L; Aux--) pTable[Aux] = PQdelmax(); }
AED (IST/DEEC)
23
Complexidade da memria extra: N, para o acervo A memria extra pode ser eliminada, se o acervo for construdo na prpria tabela a ordenar.
Primeiro, constroi-se o acervo chamado FixDown na metade inicial da tabela. Depois, troca-se a raiz com o ltimo elemento e faz-se o FixDown sobre a tabela de dimenso menos 1)
24
AED (IST/DEEC)
FixDown(Table, Aux, R); /* Reordena a tabela, trocando o topo e exercendo FixDown na tabela com dimenso 1 ( na troca, o menor j colocado na posio final) */ while(Top > L){ exch(Table[L], Table[Top]); FixDown(Table, L, --Top); }
}
AED (IST/DEEC) 25
Ordenao custa sempre O(N lg N), qualquer que seja o formato da entrada ver exemplos no Sedgewick .5
AED (IST/DEEC)
26
AED (IST/DEEC)
27