Download - aed4

Transcript
  • 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


Top Related