aed4
DESCRIPTION
Algoritmos e estruturas de dadosprof Luis Antunes FCULTRANSCRIPT
-
Filas em ingls Queues pronuncia-se ku
Fac. Cincias Univ. Lisboa Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011
-
Hoje
! Especificao da fila.
! Ligao a uma classe Java.
! Implementao vectorial.
Fac. Cincias Univ. Lisboa
Luis Antunes Algoritmos e Estruturas de Dados 2010-2011
-
Operaes de uma fila
! Queremos especificar uma fila (FIFO First In First Out) de elementos arbitrrios.
! Com as seguintes operaes: ! make: para construir uma fila vazia; ! enqueue: para adicionar um elemento no fim da fila; ! isEmpty: para verificar se a fila est vazia; ! front: para obter o elemento no princpio da fila; e ! dequeue: para eliminar o elemento no princpio da fila.
Fac. Cincias Univ. Lisboa
Luis Antunes Algoritmos e Estruturas de Dados 2010-2011
-
Especificao da Fila (Queue) specification sorts Queue constructors make: > Queue; enqueue: Queue Element > Queue; observers front: Queue >? Element; dequeue: Queue >? Queue; isEmpty: Queue; domains Q: Queue; front(Q) if not isEmpty (Q); dequeue(Q) if not isEmpty (Q); axioms Q: Queue ; E: Element ; front(enqueue(Q, E)) = E when isEmpty(Q) else front(Q); dequeue(enqueue(Q, E)) = Q when isEmpty(Q) else enqueue(dequeue(Q),E); isEmpty (make ()) ; not isEmpty (Queue(Q, E)); end specification"
Fac. Cincias Univ. Lisboa
Luis Antunes Algoritmos e Estruturas de Dados 2010-2011
-
Construo da Especificao
! Classificamos as 5 operaes nas 3 categorias (constructors, observers, e others)
! Comeamos por escrever as suas assinaturas: ! para construir uma fila vazia:
! make: Queue; ! para pr um elemento na fila precisamos de uma fila e
um elemento, obtemos uma nova fila que contm o elemento adicionado (seja de tipo Element): ! enqueue: Queue Element Queue;
Fac. Cincias Univ. Lisboa
Luis Antunes Algoritmos e Estruturas de Dados 2010-2011
-
Construo da Especificao
! A operao isEmpty um predicado: ! isEmpty: Queue;
! Para obter o elemento da frente da fila, precisamos de uma fila, e obtemos um elemento:
! front: Queue Element;
! Finalmente para remover um elemento de uma fila, precisamos de uma fila, e obtemos uma fila
! dequeue: Queue Queue;
Fac. Cincias Univ. Lisboa
Luis Antunes Algoritmos e Estruturas de Dados 2010-2011
-
Constructors
! Claro que nem isEmpty nem front, j que no retornam nenhuma Queue.
! A pergunta seguinte : ! Das 3 operaes que sobram, so TODAS absolutamente
necessrias para construir QUALQUER fila imaginvel?
! Suponhamos a fila Q que se obtm de Q atravs da operao dequeue. Podemos obter Q de outra forma?
! SIM: bastaria nunca ter adicionado o elemento retirado pelo dequeue
! Ento, os constructors so make e enqueue.
Fac. Cincias Univ. Lisboa
Luis Antunes Algoritmos e Estruturas de Dados 2010-2011
-
Classificao das restantes ops.
! isEmpty, front e dequeue vo para observers e others
! podemos definir algum deles apenas em termos dos outros dois? NO
! ento colocamos todos em observers
! e others fica vazio.
Fac. Cincias Univ. Lisboa
Luis Antunes Algoritmos e Estruturas de Dados 2010-2011
-
Prximo passo: Domains
! Ateno s funes que no e4sto definidas para valores arbitrrios dos parmetros
! S h problemas com o elemento da frente de uma fila vazia, logo usamos o smbolo de funo parcial ? ! front(Q) if not isEmpty(Q);#! dequeue(Q) if not isEmpty(Q);#
Fac. Cincias Univ. Lisboa
Luis Antunes Algoritmos e Estruturas de Dados 2010-2011
-
Axioms
! O passo final, e o mais importante.
! Primeiro: observers vs. constructors (ou seja, observar o resultado de aplicar um constructor). So 2 x 3 axiomas, menos 2, porque front e dequeue no se podem aplicar a filas vazias:
! Obviamente: ! isEmpty (make());#! not isEmpty (enqueue (Q, E));#
Fac. Cincias Univ. Lisboa
Luis Antunes Algoritmos e Estruturas de Dados 2010-2011
-
Mais Axioms
! Como no podemos observar o front de uma queue obtida com make, concentramo-nos das queues obtidas com enqueue
! Ento, juntmos um elemento E no fim da fila Q, e agora estamos a perguntar qual o elemento no princpio.
Fac. Cincias Univ. Lisboa
Luis Antunes Algoritmos e Estruturas de Dados 2010-2011
-
Mais Axioms ! O caso simples quando a fila tem um s elemento, E, esse o
do princpio ! Ter um s elemento quer dizer que estava vazia antes da sua
insero, ou seja, estava isEmpty(Q). ! Fica
! front (enqueue (Q, E)) = E if isEmpty(Q);#
! E quando Q no est vazia, pedimos a frente da velha fila Q: ! front (enqueue (Q, E)) =
# #front (Q) if not isEmpty(Q);#
! Combinando os dois: ! front(enqueue(Q, E)) =
E when isEmpty(Q) else front(Q);#
Fac. Cincias Univ. Lisboa
Luis Antunes Algoritmos e Estruturas de Dados 2010-2011
-
Mais axiomas:
! Para relacionar dequeue com enqueue
! O lado esquerdo ser dequeue(enqueue(Q, E))
! Fcil quando Q est vazia: retirar um elemento aps adicion-lo d a fila Q"
! Quando Q no est vazia temos que fazer dequeue. Mas repare-se que temos que fazer dequeue de enqueue(Q) e no de Q.
! Logo temos que colocar E de volta no resultado de dequeue(Q)#
Fac. Cincias Univ. Lisboa
Luis Antunes Algoritmos e Estruturas de Dados 2010-2011
-
Axioma para dequeue
! Fica: ! dequeue (enqueue(Q, E)) =
Q when isEmpty(Q) else enqueue (dequeue (Q), E);#
! Exemplo:
Fac. Cincias Univ. Lisboa
Luis Antunes Algoritmos e Estruturas de Dados 2010-2011
e d c b a
d c b a Esta Q
Esta enqueue(Q,e)
e d c b E esta dequeue(enqueue(Q,e))
d c b a Novamente Q
d c b dequeue(Q)
enqueue(dequeue(Q),e) e d c b
-
Especificao de Element#! Fica como antes, sem qualquer restrio:
! specification sorts Element end specification#
Fac. Cincias Univ. Lisboa
Luis Antunes Algoritmos e Estruturas de Dados 2010-2011
-
Refinement do Queue ! Usamos
! Object para Element ! VectorialQueue para Queue
! refinement Element is class Object Queue is class VectorialQueue { make: Queue is VectorialQueue(); enqueue: Queue e: Element Queue is void offer(Object e); front: Queue ? Element is Object element(); dequeue: Queue ? Queue is void remove(); } end refinement#
Fac. Cincias Univ. Lisboa
Luis Antunes Algoritmos e Estruturas de Dados 2010-2011
-
implementao
! A classe LinkedList implementa a interface Queue#
! Exemplo: ! Queue names = new LinkedList();#
! Como names do tipo Queue s se podem aplicar mtodos da interface Queue.
! Outra implementao com DoubleLinkedList#
! Ainda outra com CircularArray#
Fac. Cincias Univ. Lisboa
Luis Antunes Algoritmos e Estruturas de Dados 2010-2011
-
Implementao vectorial
Fac. Cincias Univ. Lisboa
Luis Antunes Algoritmos e Estruturas de Dados 2010-2011
-
constructors
Fac. Cincias Univ. Lisboa
Luis Antunes Algoritmos e Estruturas de Dados 2010-2011
-
Mtodos pblicos
Fac. Cincias Univ. Lisboa
Luis Antunes Algoritmos e Estruturas de Dados 2010-2011
-
Mtodos auxiliares
Fac. Cincias Univ. Lisboa
Luis Antunes Algoritmos e Estruturas de Dados 2010-2011
-
Classe Adaptadora
! Chama-se adapter class a uma classe que implementa uma interface essencialmente renomeando os mtodos de uma outra classe.
! Por exemplo no ListStack, usar push em vez de add.
! Isto um exemplo de reutilizao de cdigo para fazer herana por delegao.
Fac. Cincias Univ. Lisboa
Luis Antunes Algoritmos e Estruturas de Dados 2010-2011