180 likes | 317 Views
TAD Fila com Prioridade -FCP. ATAI. 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.
E N D
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”.
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()
Ordenação através de uma FCP A Fila com Prioridade (P) pode ser usada para ordenar sequencia S: • Introdução elementos de S numa P através de uma série de operações insertItem (uma para cada elemento de S) • 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)
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)
Elemento daTAD 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
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.
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)
Implementação FCPsequencia 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.
Implementação FCPsequencia 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).
Implementação FCPsequencia 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.
Implementação FCPsequencia ordenada publicclassSequenceSimplePriorityQueueimplements 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 publicSequenceSimplePriorityQueue (Comparator c) {comp = c; } public int size () {return seq.size(); }
Implementação FCPsequencia 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)); }}}
Implementação FCPsequencia 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(); }
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))
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).
Insertion Sort • Insertion sort é a ordenação que resulta quando utilizamos uma sequencia ordenada na implementação de uma PriorityQueueSort
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.