JAVA – Fila ATAI.

Slides:



Advertisements
Apresentações semelhantes
LISTAS Dilvan Moreira, parcialmente baseado em material do prof. Ricardo Campello.
Advertisements

ESTRUTURA DE DADOS Professor: Marcelo Mendes Turma: MBI-1
Programação em Java Prof. Maurício Braga
O TAD fila O TAD fila armazena objetos arbitrários
Pilhas e Filas CONTEÚDO (1) Pilhas (2) Filas.
Programação Avançada I
TAD Deque ATAI.
Pesquisa em Memória Primária
Filas David Menotti Estruturas de Dados I DECOM – UFOP.
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
Pesquisa em Memória Primária
Aula T12 – BCC202 Listas Túlio Toffolo
Listas lineares Listas Lineares Fila Dupla Pilha Fila Saída restrita
Listas lineares Listas Lineares Fila Dupla Pilha Fila Saída restrita
Árvores Introdução e Aplicações Árvores de Busca Binária Fundamentos
Estruturas de Dados e Algoritmos
Listas Ligadas – Conceitos Avançados
Erros A Evitar Redundância de Programação public void insere( Priorizavel obj ) throws listaVaziaException; Lançamento de exceções.
AED – Algoritmos e Estruturas de Dados
FILAS (Queues) Estrutura linear de acesso seqüencial que ordena seus elementos pela seqüência cronológica de sua entrada; Estrutura FIFO (First In First.
Análise Léxica Supondo o trecho de programa abaixo:
Construção de Compiladores
7 Abstração Genérica Unidades genéricas e instanciação.
Listas com Ponteiros Listas encadeadas Listas circulares.
Slides: Prof. João Fabro UTFPR - Curitiba
Robson Godoi / Sandra Siebra
Listas Encadeadas.
Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba
Denise Guliato Faculdade de Computação – UFU
Denise Guliato Faculdade de Computação – UFU
Denise Guliato Faculdade de Computação – UFU
INTELIGÊNCIA ARTIFICIAL
Implementação de FILAS com Alocação Dinâmica
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação
Denise Guliato Faculdade de Computação – UFU
Listas, Filas e Pilhas Katia Guimarães.
Aula 3 Listas, pilhas, filas.
Estruturas de Dados Aula 9: Listas (parte 1)
Pilhas Profa. Nádia Félix.
Lista encadeada Representar um grupo de dados.
Estruturas de Dados PROFESSOR DIÓGENES FURLAN. Estruturas de Dados (ED) Programas operam sobre dados Dados são relacionados e possuem estrutura Como representar.
Estruturas de Dados Aula 11: TAD Pilha
Listas Simplesmente Encadeadas
Tipos Especiais de Listas
Tratamento de Exceções
Universidade Católica de Angola Prática de laboratório Fundamentos de Programação II Frei Joaquim José Hangalo.
© 2011 Pearson Prentice Hall. Todos os direitos reservados.slide 1 © 2011 Pearson Prentice Hall. Todos os direitos reservados.slide 1 © 2011 Pearson Prentice.
1 Marcio de Carvalho Victorino JAVA. 2 Declaração de Atributos [ ] [transient] [volatile] [static] [final] ; controle de acesso –public, package (default),
Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -
Estruturas de Dados I Segundo Período de 2008 Gabarito da Primeira Prova.
Lista Linear Base para outras estruturas
Certificação Marco Antonio. Introdução A compreensão desse capítulo é muito importante pois trata de um assunto essencial em qualquer linguagem de programação,
Recursividade Profs. De Prog2 e Lab2.
Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor. Variáveis e métodos estáticos, Passagem de.
Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -
Analise de Algoritmos e Notação Assintótica
1 TAD Fila com Prioridade -FCP ATAI. 2 TAD Fila com Prioridade (Priority Queue) TAD Fila com Prioridade armazena uma colecção de elementos com prioridade.
Objetivos Ao concluir esta Disciplina espera-se que os alunos sejam capazes de: Distinguir os conceitos de Estrutura e Dados; Compreender o que são, como.
© Copyright 2007 Algoritmos e Estruturas de Dados - Todos os direitos reservados Estruturas de Dados Dinâmicas IF672 - Algoritmos e Estruturas de Dados.
Estruturas de Dados Murilo Salgado Razoli.
Estrutura de Dados Aula 3 - Listas
Estrutura de dados Pilhas e filas
11 Pilhas, Filas e Listas Duplamente Encadeadas Prof. Kariston Pereira Adaptado de Material gentilmente fornecido pelo Prof. Rui Tramontin (DCC/UDESC)
Tipo Abstrato de Dados (TAD) Estrutura de Dados Professor: Rodrigo Alves Sarmento Professor: André Cypriano.
Estrutura de Dados Prof. André Cypriano M. Costa
UNIVERSIDADE FEDERAL DE MINAS GERAIS Pilhas e Filas Cristiano Arbex Valle Vinicius Fernandes dos Santos
Alocação Dinâmica Dilvan Moreira. Objetivos  Entender o que são e como usar:  Gerenciamento de Memória  Alocação Dinâmica em C.
Laboratório de Computação Aula 06 e 07 – Implementação de classes Prof. Fábio Dias
Linguagem de Programação – Aula 04 Prof. Me. Ronnison Reges Vidal.
Transcrição da apresentação:

JAVA – Fila ATAI

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

Definição de TAD Fila

Definição do TAD Fila (linguagem natural) 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). Objectos podem ser inseridos sempre que necessário, mas apenas o inserido a mais tempo (o primeiro) pode ser removido. Dizemos que os elementos são inseridos no final da fila (rear/tail) e removidos do início da fila (front/head). O nome fila deriva de uma analogia com uma fila de pessoas. As operações fundamentais são inserir na fila (ensere/enqueue) e remover da fila (remove/dequeue).

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

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) 3 (7) inicio( ) 7 ( ) "erro" estaVazia( ) Verdade insere(9) (9) (9,7) tamanho( ) 2 (9,7,3) (9,7,3,5) 9 (7,3,5)

Implementação de TAD Fila

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

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

Passo2: Escolha da representação concreta do TAD (cont) Vamos usar um array de tamanho fixo para implementar uma fila F, de N entradas (p.e.: N = 1.000) para armazenar os elementos Uma solução, seria fazer F[0] sempre ser o início da fila e deixar a fila crescer a partir daí 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 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 Cada método da implementação do ADT fila através de um array circular é executado no tempo O(1)

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

Passo2: Escolha da representação concreta do TAD (cont) Para evitar mover os objectos colocados em F, nós definimos duas variáveis i e f, que têm os seguintes significados: 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 Quando queremos remover um elemento do início da fila, nós podemos simplesmente incrementar i para o índice da próxima célula 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

Passo2: Escolha da representação concreta do TAD (cont) Este esquema requer um tempo constante para execução de cada método porém, apresenta um problema: 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- array-fora-de-limites 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] A circularidade é obtida incrementando: i para (i+1) mod N e f para (f+1) mod N

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

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

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

Passo2: Escolha da representação concreta do TAD Fila (algoritmo) Algoritmo remove( ): se estaVazia( ) então lança FilaVaziaException temp <- F[ i ] F[ i ] <- null i <- ( i + 1 ) mod N retorna temp Algoritmo insere( o ): se tamanho( ) = N -1 então lança FilaCheiaException F[ f ] <- o f <-( f + 1 ) mod N Algoritmo tamanho( ): retorna (N - i + f) mod N Algoritmo estaVazia( ): retorna i = f Algoritmo inicio( ): se estaVazia( ) então lança FilaVaziaException retorna F[ i ] mod em Java: %

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

Passo2: Escolha da representação concreta do TAD Fila (cont.) 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

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

Passo2: 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.setElemento( obj ); no.setProximo( null ); // o no será o novo // no cauda if( estaVazia() ) cabeca = no; // caso especial da fila // previamente vazia else cauda.setProximo( no ); // adiciona o no à // cauda da lista cauda = no; // actualiza a referência para o tamanho++; }

Passo2: Escolha da representação concreta do TAD Fila (cont.) public Object remove( ) throws FilaVaziaException { // Remove o primeiro objecto da fila Object obj; if (estaVazia()) throw new FilaVaziaException(); obj = cabeca.getElemento( ); cabeca = cabeca.getProximo( ); tamanho--; if( tamanho == 0 ) cauda = null; // a pilha agora está vazia return obj; }

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

Classe FilaVaziaExceptions public class FilaVaziaException extends RuntimeException { public FilaVaziaException () super(“Fila esta vazia”); }