JAVA Fila ATAI 1 Teria de Tipos de

  • Slides: 24
Download presentation
JAVA – Fila ATAI 1

JAVA – Fila ATAI 1

Teória de Tipos de Dados Abstractos 1. Definição de TAD q Especificar as propriedades

Teória de Tipos de Dados Abstractos 1. Definição de TAD q Especificar as propriedades fundamentais de um tipo de dado, de um modo independente da sua implementação numa linguagem. 2. Implementação de TAD em JAVA q Passo 1: Definição da Interface Descrição os nomes dos métodos que o TAD suporta e como eles são declarados e usados q Passo 2: Escolha da representação concreta do TAD Decisão: Estrutura estática ou dinâmica. q Passo 3: Implementação da interface Uso do mecanismo de classes 2

Definição de TAD Fila 3

Definição de TAD Fila 3

Definição do TAD Fila (linguagem natural) n Uma fila é um contentor de objectos

Definição do TAD Fila (linguagem natural) n Uma fila é um contentor de objectos que são inseridos e removidos de acordo com o princípio primeiro-a-entrar-primeiro-a-sair (PEPS) ou first-in-first-out (FIFO). n Objectos podem ser inseridos sempre que necessário, mas apenas o inserido a mais tempo (o primeiro) pode ser removido. n Dizemos que os elementos são inseridos no final da fila (rear/tail) e removidos do início da fila (front/head). n O nome fila deriva de uma analogia com uma fila de pessoas. n As operações fundamentais são inserir na fila (ensere/enqueue) e remover da fila (remove/dequeue). 4

Definição do TAD Fila (operações) n O ADT fila suporta os seguintes métodos fundamentais:

Definição do TAD Fila (operações) n O ADT fila suporta os seguintes métodos fundamentais: q q n insere(o): Insere o objecto o no final da fila n Entrada: Objecto; Saída: Nenhuma remove(): Remove e retorna o objecto do início da fila - um erro ocorre se a fila está vazia n Entrada: Nenhuma; Saída: Objecto Adicionalmente temos os seguintes métodos: q q q tamanho(): Retorna o número de objectos na fila n Entrada: Nenhuma; Saída: Inteiro esta. Vazia(): Retorna um valor booleano indicando se a fila está vazia n Entrada: Nenhuma; Saída: Booleano inicio(): Retorna o objecto do inicio da fila, sem removê-lo - um erro ocorre se a fila está vazia n Entrada: Nenhuma; Saída: Objecto 5

Exemplo de execução numa fila F Operação Saída F insere(5) - (5) insere(3) -

Exemplo de execução numa fila F Operação Saída F insere(5) - (5) insere(3) - (5, 3) remove( ) 5 (3) insere(7) - (3, 7) remove( ) 3 (7) inicio( ) 7 (7) remove( ) 7 () remove( ) "erro" () esta. Vazia( ) Verdade () insere(9) - (9) insere(7) - (9, 7) tamanho( ) 2 (9, 7) insere(3) - (9, 7, 3) insere(5) - (9, 7, 3, 5) remove( ) 9 (7, 3, 5) 6

Implementação de TAD Fila 7

Implementação de TAD Fila 7

Passo 1: Definição da Interface Fila public interface Fila { // Métodos de acesso

Passo 1: Definição da Interface Fila public interface Fila { // Métodos de acesso public int tamanho( ); public boolean esta. Vazia( ); public Object inicio( ) throws Fila. Vazia. Exception; // // Retorna o número de elementos na fila Vê se a fila está vazia Retorna o elemento do início se a fila não está vazia // Métodos de atualização public void insere( Object elemento ) throws Fila. Cheia. Exception; public Object remove( ) // throws Fila. Vazia. Exception; // // // Insere um // elemento // na fila Retorna e remove o elemento do inicio da fila se chamado com a fila não vazia } 8

Implementação de TAD Fila Passo 2 (com a utilização da estrutura estática) 9

Implementação de TAD Fila Passo 2 (com a utilização da estrutura estática) 9

Passo 2: Escolha da representação concreta do TAD (cont) n Vamos usar um array

Passo 2: Escolha da representação concreta do TAD (cont) n Vamos usar um array de tamanho fixo para implementar uma fila F, de N entradas (p. e. : N = 1. 000) para armazenar os elementos n Uma solução, seria fazer F[0] sempre ser o início da fila e deixar a fila crescer a partir daí n Esta solução não seria eficiente e requereria mover todos os elementos da fila quando houvesse uma remoção, requerendo bastante tempo de processamento para a operação remove n Para obtermos um tempo constante na execução de cada método, nós precisamos de uma solução de configuração diferente Solução: Uso de array circular n Cada método da implementação do ADT fila através de um array circular é executado no tempo O(1) 10

Passo 2: Escolha da representação concreta do TAD (cont) n Num array circular de

Passo 2: Escolha da representação concreta do TAD (cont) n Num array circular de tamanho n, todo o elemento possui um sucessor e antecessor, em particular: q O sucessor de a[n– 1] é a[0] q O antecessor de a[0] é a[n– 1]. n Maneira alternativas de visualizar um array circular (tamanho 8): 7 6 1 5 2 4 0 1 2 3 4 5 6 0 3 7 11

Passo 2: Escolha da representação concreta do TAD (cont) n Para evitar mover os

Passo 2: Escolha da representação concreta do TAD (cont) n Para evitar mover os objectos colocados em F, nós definimos duas variáveis i e f, que têm os seguintes significados: q q q i é o índice da célula do array na fila F que armazena o primeiro elemento da fila f é o índice da próxima célula disponível do array na fila F i = f significa que a fila está vazia e no começo, i = f = 0 n Quando queremos remover um elemento do início da fila, nós podemos simplesmente incrementar i para o índice da próxima célula n Quando queremos inserir um elemento no final da fila, nós podemos simplesmente incrementar f para o índice da próxima célula disponível em F 12

Passo 2: Escolha da representação concreta do TAD (cont) n Este esquema requer um

Passo 2: Escolha da representação concreta do TAD (cont) n Este esquema requer um tempo constante para execução de cada método porém, apresenta um problema: q após N-1 inserções e remoções de um único elemento, teremos i = f = N-1 e a próxima inserção causará um erro índice-de- arrayfora-de-limites n Para evitar este problema, definiremos o array F como circular, isto é, o array vai de F[0] até F[N-1] e F[0] segue F[N-1] n A circularidade é obtida incrementando: q q i para (i+1) mod N f para (f+1) mod N e 13

Passo 2: Escolha da representação concreta do TAD (cont) configuração "normal" da fila configuração

Passo 2: Escolha da representação concreta do TAD (cont) configuração "normal" da fila configuração wrapped around da fila 14

Passo 2: Escolha da representação concreta do TAD (cont) n Animação (com maxlen =

Passo 2: Escolha da representação concreta do TAD (cont) n Animação (com maxlen = 6): After Initially: adding Martin: removing Maggie: Ralph: Nelson: Homer, the front Marge, element: Bart, Lisa: 0 1 2 Homer Martin elems Nelson Marge Bart front 3210 rear 21504 3 4 5 Lisa Maggie Ralph length 54063 15

Passo 2: Escolha da representação concreta do TAD (cont) n Isto resolve o problema

Passo 2: Escolha da representação concreta do TAD (cont) n Isto resolve o problema parcialmente pois, as situações de fila vazia e fila cheia serão representadas, ambas, por i = f n A solução apresentada aqui é limitar o número máximo de elementos na fila a N-1 e lançar uma excepção Fila. Cheia. Exception para sinalizar que não é possível fazer mais inserções n A computação do tamanho da fila será dada por: (N-i+f) mod N 16

Passo 2: Escolha da representação concreta do TAD Fila (algoritmo) Algoritmo tamanho( ): retorna

Passo 2: Escolha da representação concreta do TAD Fila (algoritmo) Algoritmo tamanho( ): retorna (N - i + f) mod N Algoritmo esta. Vazia( ): retorna i = f Algoritmo inicio( ): se esta. Vazia( ) então lança Fila. Vazia. Exception Algoritmo remove( ): se esta. Vazia( ) então lança Fila. Vazia. Exception temp <- F[ i ] <- null i <- ( i + 1 ) mod N retorna temp Algoritmo insere( o ): se tamanho( ) = N -1 então lança Fila. Cheia. Exception F[ f ] <- o f <-( f + 1 ) mod N retorna F[ i ] mod em Java: % 17

Implementação de TAD Fila Passo 2 (com a utilização da estrutura dinâmica) (lista simplesmente

Implementação de TAD Fila Passo 2 (com a utilização da estrutura dinâmica) (lista simplesmente ligada) 18

Passo 2: Escolha da representação concreta do TAD Fila (cont. ) n n n

Passo 2: Escolha da representação concreta do TAD Fila (cont. ) n n n As remoções serão feitas na cabeça da lista e as inserções na cauda da lista Cada método da implementação do ADT fila através de uma lista simplesmente encadeada executa no tempo O(1) A implementação do ADT fila através de uma lista simplesmente encadeada não limita o número de elementos na fila 19

Passo 2: Escolha da representação concreta do TAD Fila (cont. ) n Representação de

Passo 2: Escolha da representação concreta do TAD Fila (cont. ) n Representação de uma fila: i f fila Vazia: i f Ilustração: i f element Homer element Marge element Bart Lisa 20

Passo 2: Escolha da representação concreta do TAD Fila (cont. ) public void insere(

Passo 2: Escolha da representação concreta do TAD Fila (cont. ) public void insere( Object obj ); // coloca um novo objecto na final da fila No no = new No( ); no. set. Elemento( obj ); no. set. Proximo( null ); // o no será o novo // no cauda if( esta. Vazia() ) cabeca = no; // caso especial da fila // previamente vazia else cauda. set. Proximo( no ); // adiciona o no à // cauda da lista cauda = no; // actualiza a referência para o // no cauda tamanho++; } 21

Passo 2: Escolha da representação concreta do TAD Fila (cont. ) public Object remove(

Passo 2: Escolha da representação concreta do TAD Fila (cont. ) public Object remove( ) throws Fila. Vazia. Exception { // Remove o primeiro objecto da fila Object obj; if (esta. Vazia()) throw new Fila. Vazia. Exception(); obj = cabeca. get. Elemento( ); cabeca = cabeca. get. Proximo( ); tamanho--; if( tamanho == 0 ) cauda = null; // a pilha agora está vazia return obj; } 22

Uso de classe Interna public class Fila. Dinamica implements Fila{ private No cabeca; private

Uso de classe Interna public class Fila. Dinamica implements Fila{ private No cabeca; private No cauda; private class No { Object elemento; No proximo; } public int tamanho( ){return 0; } public boolean esta. Vazia( ) { return (cabeca == null); } public void insere( Object e ){ No aux = new No(); aux. elemento =e; aux. proximo = null; if (esta. Vazia() ) { cabeca = aux; cauda = aux; } else { cauda. proximo = aux; cauda =aux; } } public Object remove( ){ 23

Classe Fila. Vazia. Exceptions public class Fila. Vazia. Exception extends Runtime. Exception { public

Classe Fila. Vazia. Exceptions public class Fila. Vazia. Exception extends Runtime. Exception { public Fila. Vazia. Exception () { super(“Fila esta vazia”); } } 24