TAD Fila com Prioridade -FCP
ATAI
1
TAD Fila com Prioridade (Priority Queue)
TAD
Fila com Prioridade armazena uma colecção de elementos com
prioridade.
Na
Fila com Prioridade só é possível remover ou aceder ao elemento com
a maior prioridade.
Prioridade é o valor associado a cada elemento e é do tipo ordenado.
Exemplo: Sala de emergência do hospital , onde o doente mais crítico é
atendido primeiro.
É diferente das estruturas de dados posicionais (pilhas, filas, sequencias,
árvores,…), que armazenam elementos em posições específicas de acordo
com inserção e remoção.
Fila com Prioridade armazena elementos de acordo com suas prioridades e
não tem noção de “posição”.
2
Chaves e relação de ordem total

Uma Fila com Prioridade precisa de uma regra de comparação que
defina uma relação de ordem total (). Essa ordem é definida para
cada par de chaves e deve satisfazer as seguintes propriedades:
Reflexiva: k  k
Anti-simétrica: se k1  k2 e k2  k1, então k1 = k2
Transitiva: se k1  k2 e k2  k3, então k1  k3

Uma Fila com Prioridade (P) suporta os seguintes métodos
fundamentais:
min()
insertItem(k, e)
removeMin()
3
Ordenação através de uma FCP
A Fila com Prioridade (P) pode ser usada para ordenar sequencia S:
1.
Introdução elementos de S numa P através de uma série de operações
insertItem (uma para cada elemento de S)
2.
Remoção elementos de P em ordem crescente através de operaçõs
removeMin colocando-os novamente em S em ordem
Algoritmo PriorityQueueSort(S, P):
•Entrada: uma sequencia S que armazena n elementos para os quais uma relação
de ordem total está definida, e a Fila com Prioridade P que compara chaves
usando a mesma relação de ordem total.
•Saida: A sequencia S ordenada pela relação de ordem total.
while !S.isEmpty() do
e  S.removeFirst()
P.insertItem(e, e) {a chave é o próprio elemento}
while !P.isEmpty() do
e  P.removeMin()
S.insertLast(e)
4
TAD Fila com Prioridade
Uma Fila com Prioridade suporta os seguintes métodos:

size()
Retorna o número de elementos em P
Entrada: Nenhuma; Saída: Inteiro

isEmpty()
Testa se P esta vazia
Entrada: Nenhuma; Saída: boolean

insertItem(k,e) Insere um novo elemento e com chave k em P
Entrada: objectos K (chave) e e (elemento); Saída: Nenhuma

minElement() Retorna (sem remover) o elemento de P com menor chave.
Um erro ocorre se o P está vazia.
Entrada: Nenhuma; Saída: Objecto (elemento)

minKey()
Retorna o menor chave em P. Um erro ocorre se o P está vazia.
Entrada: Nenhuma; Saída: Objecto (chave)

removeMin()
Remove de P e retorna o elemento com a menor chave. Um erro
ocorre se o P está vazia.
Entrada: Nenhuma; Saída: Objecto (elemento)
5
Elemento da TAD Fila com Prioridade


O elemento da Fila com Prioridade é do tipo
item
Cada item possui duas partes:


O objecto que define a prioridade (chave) deste
elemento (e que é do tipo comparavel)
O objecto que representa o próprio elemento a
ser guardado na Fila com Prioridade
6
Implementações possíveis do TAD FCP
Uma sequencia não ordenada
Operação insertItem(k,e) permite inserir o elemento no conjunto. A
operação removeMin() é mais complexa, requer a procura de elemento
com a prioridade máxima.
Uma sequencia ordenada (por valores de prioridade)
O elemento com maior prioridade fica posicionado na cabeça da lista.
Nesta abstracção a operação removeMin() é simples, a operação
insertItem(k,e) é mais complexa porque o elemento deve ser inserido na
posição correcta para a fila continuar ser ordenada.
Heap
Uma estrutura não linear, parecida com uma árvore binária.
7
Ordem de grandeza das Chaves

Usamos objectos comparadores especiais
para poder comparar chaves

Objecto comparadore é externo.

Quando a fila com prioridade precisa de
comparar duas chaves, ela usa
comparador que foi fornecido para
comparar este tipo de chaves.

Desta forma a fila com prioridade pode ser
generica e guardar todo tipo de objectos.

TAD Comparator inclui os seguintes
metodos:
-isLessThan(a, b)
-isLessThanOrEqualTo(a,b)
-isEqualTo(a, b)
-isGreaterThan(a,b)
-isGreaterThanOrEqualTo(a,b)
-isComparable(a)
8
Implementação FCP
sequencia não ordenada

Os elementos de S são composição de dois elementos: k
(chave) e e (elemento).

Podemos implementar insertItem() usando insertLast() da
sequencia. O tempo de execução é O(1).

Como inserção é sempre feita no fim, a sequencia não esta
ordenada.
9
Implementação FCP
sequencia não ordenada

Para os metodos minElement(), minKey(), e removeMin(), nos
devemos procurar em todos os elementos da sequencia S. O pior caso
é de O(n).
10
Implementação FCP
sequencia ordenada

Nesta implementação os métodos minElement(), minKey(), e
removeMin() demoram O(1)

A operação insertItem(), no pior caso vai demorar O(n) para
encontrar o lugar de inserção do elemento.
11
Implementação FCP
sequencia ordenada
public class SequenceSimplePriorityQueue implements
SimplePriorityQueue {
protected Sequence seq = new NodeSequence();
protected Comparator comp;
// auxiliary methods
protected Object key (Position pos) {
return ((Item)pos.element()).key();
} // note casting here
protected Object element (Position pos) {
return ((Item)pos.element()).element();
} // casting here too
public SequenceSimplePriorityQueue (Comparator c) {comp = c; }
public int size () {return seq.size(); }
12
Implementação FCP
sequencia ordenada
public void insertItem (Object k, Object e) throws InvalidKeyException {
if (!comp.isComparable(k)) {
throw new InvalidKeyException("The key is not valid");}
else {if (seq.isEmpty()) {
//se sequencia esta vazia, é o primeiro item a ser inserido
seq.insertFirst(new Item(k,e)); }
else { //verifica se pode ser inserido no final
if (comp.isGreaterThan(k,key(seq.last()))) {
seq.insertAfter(seq.last(),new Item(k,e)); }
else { //procurar o citio certo para k
Position curr = seq.first();
while (comp.isGreaterThan(k,key(curr))) {
curr = seq.after(curr);
}
seq.insertBefore(curr,new Item(k,e));
}}}
13
Implementação FCP
sequencia ordenada
public Object minElement () throws
EmptyContainerException {
if (seq.isEmpty())
throw new EmptyContainerException("The priority
queue is empty");
else
return element(seq.first());
}
public boolean isEmpty () {
return seq.isEmpty();
}
14
Selection Sort

Selection Sort é uma variante de Ordenação que utiliza FCP
para ordenar a sequencia. FCP é implementado utilizando
uma sequencia não ordenada.


Fase 1, inserção de item para a fila P (O(1) )
Fase 2, remoção do item de P demora tempo proporcional ao
número de elementos da fila (O(n2))
15
Selection Sort (cont.)

Na fase 2 o tempo de execução é o seguinte: A primeira vez que é
executada a operação removeMinElement demora O(n), a segunda
vez demora O(n-1), etc. A ultima vez demora O(1).

O tempo total na fase 2 é:

Sabemos que:

Logo a complexidade da fase 2 é O(n2).
16
Insertion Sort

Insertion sort é a ordenação que resulta quando utilizamos uma
sequencia ordenada na implementação de uma PriorityQueueSort
17
Insertion Sort(cont.)

A fase 2 é melhorada para O(n).

A fase 1 existe um estrangulamento. A primeira chamada a
insertItem demora O(1), a segunda demora O(2), a última
demora O(n) , o tempo total é O(n2).

Selection sort e insertion sort ambas são de ordem O(n2).

Selection sort executa sempre um número de operações
proporcionais a n2, independentemente da sequencia de
entrada.
O tempo de execução da insertion sort varia do tipo de
sequencia de entrada.

18
Download

FilaComPrioridade