Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Algoritmos e Estrutura de Dados em - Java, Notas de estudo de Algoritmos

Algoritmos e Estrutura de Dados em - Java

Tipologia: Notas de estudo

2012

Compartilhado em 01/03/2012

leonardo-oliveira-28
leonardo-oliveira-28 🇧🇷

1 documento

1 / 142

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
CS-14
Algoritmos e Estrutura de
Dados em Java
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47
pf48
pf49
pf4a
pf4b
pf4c
pf4d
pf4e
pf4f
pf50
pf51
pf52
pf53
pf54
pf55
pf56
pf57
pf58
pf59
pf5a
pf5b
pf5c
pf5d
pf5e
pf5f
pf60
pf61
pf62
pf63
pf64

Pré-visualização parcial do texto

Baixe Algoritmos e Estrutura de Dados em - Java e outras Notas de estudo em PDF para Algoritmos, somente na Docsity!

CS-

Algoritmos e Estrutura de

Dados em Java

A Caelum atua no mercado com consultoria, desenvolvimento e ensino em computação. Sua equipe participou do desenvolvimento de projetos em vários clientes e, após apresentar os cursos de verão de Java na Universidade de São Paulo, passou a oferecer treinamentos para o mercado. Toda a equipe tem uma forte presença na comunidade através de eventos, artigos em diversas revistas, participação em muitos projetos open source como o VRaptor e o Stella e atuação nos fóruns e listas de discussão como o GUJ.

Com uma equipe de mais de 60 profissionais altamente qualificados e de destaque do mercado, oferece treinamentos em Java, Ruby on Rails e Scrum em suas três unidades - São Paulo, Rio de Janeiro e Brasília. Mais de 8 mil alunos já buscaram qualificação nos treinamentos da Caelum tanto em nas unidades como nas próprias empresas com os cursos incompany.

O compromisso da Caelum é oferecer um treinamento de qualidade, com material constantemente atualizado, uma metodologia de ensino cuidadosamente desenvolvida e instrutores capacitados tecnicamente e didaticamente. E oferecer ainda serviços de consultoria ágil, mentoring e desenvolvimento de projetos sob medida para empresas.

Comunidade

Nossa equipe escreve constantemente artigos no Blog da Caelum que já conta

com 150 artigos sobre vários assuntos de Java, Rails e computação em geral.

Visite-nos e assine nosso RSS:

➡ blog.caelum.com.br

Acompanhe também a equipe Caelum no Twitter :

➡ twitter.com/caelumdev/equipe

O GUJ é maior fórum de Java em língua portuguesa, com 700 mil posts e 70 mil

usuários. As pessoas da Caelum participam ativamente, participe também:

➡ www.guj.com.br

Assine também nossa Newsletter para receber as novidades e destaques dos

eventos, artigos e promoções da Caelum:

➡ www.caelum.com.br/newsletter

No site da Caelum há algumas de nossas Apostilas disponíveis gratuitamente

para download e alguns dos artigos de destaque que escrevemos:

➡ www.caelum.com.br/apostilas

➡ www.caelum.com.br/artigos

Sobre esta apostila

Esta apostila da Caelum visa ensinar de uma maneira elegante, mostrando apenas o que é necessário e quando é necessário, no momento certo, poupando o leitor de assuntos que não costumam ser de seu interesse em determinadas fases do aprendizado.

A Caelum espera que você aproveite esse material. Todos os comentários, críticas e sugestões serão muito bem-vindos.

Essa apostila é constantemente atualizada e disponibilizada no site da Caelum. Sempre consulte o site para novas versões e, ao invés de anexar o PDF para enviar a um amigo, indique o site para que ele possa sempre baixar as últimas versões. Você pode conferir o código de versão da apostila logo no final do índice.

Baixe sempre a versão mais nova em: www.caelum.com.br/apostilas Esse material é parte integrante do treinamento Algoritmos e Estruturas de Dados com Java e distribuído gratuitamente exclusivamente pelo site da Caelum. Todos os direitos são reservados à Caelum. A distribuição, cópia, revenda e utilização para ministrar treinamentos são absolutamente vedadas. Para uso comercial deste material, por favor, consulte a Caelum previamente.

www.caelum.com.br

Índice

CAPÍTULO 1

Prefácio

Este material foi escrito para ser utilizado no curso de verão Introdução a Estrutura de dados e Algoritmos em Java , do Instituto de Matemática e Estatística da Universidade de São Paulo. As experiências como alunos e professores mostrou aos autores desta apostila os principais pontos de dificuldades no aprendizado. Isso motivou uma abordagem um pouco diferente para esta apostila em relação ao que é comum na maioria dos livros sobre o assunto A cada capítulo, apresentaremos diversos problemas que servirão de motivação para os principais conceitos de estrutura de dados. Os exercícios complementarão o aprendizado pois ajudam a fixar os conceitos vistos na apostila e estimulam o aluno para conceitos avançados que fogem do escopo deste material. Além disso, no fim de cada capítulo, apresentaremos as bibliotecas do Java que modelam as estruturas de dados apresentadas nesta apostila.

CAPÍTULO 2

Introdução

“As três coisas mais difíceis no mundo: guardar segredo, perdoar uma injúria e aproveitar o tempo”

  • Benjamin Franklin

2.1 - Introdução Considere o problema de descobrir a altura da pessoa mais alta de um grupo de pessoas. Suponha que estas pessoas estão em seqüência, como em uma fila de banco, e que esta fila não está vazia. Vamos elaborar uma estratégia para resolver este problema. Uma solução bem simples seria fazer o se- guinte:

Figura 2.1: Fila de pessoas

  1. Pegue a altura da primeira pessoa. A única informação que você tem é que esta altura é a máxima até o momento. Então, “guarde” em algum lugar esta informação.
  2. Percorra cada uma das próximas pessoas e faça o seguinte:
  3. Pegue a altura da pessoa, esta é a altura atual.
  4. Compare a altura atual com a máxima até o momento. Esta comparação pode resultar em três possibili- dades: a altura atual é menor, é igual ou é maior.
  5. Se a altura atual for maior, então faça o valor da altura máxima ser igual a atual. Será que este procedimento é bom? Nesse caso temos de percorrer todas as pessoas da fila até ter certeza que encontramos a maior pessoa, pois a única invariante que temos, a cada passo do procedimento, é que até aquele momento todas as pessoas percorridas tem tamanho igual ou menor a um determinado número.

Material do Treinamento Algoritmos e Estruturas de Dados com Java

A única coisa que precisa ser mostrada para o usuário são as operações que ele pode fazer na agenda (inserir, recuperar, atualizar, remover contato, saber quantos contatos estão na agenda, etc). Este conjunto de operações é a interface que o usuário tem com a agenda. Cada celular pode implementar a sua agenda de contatos de uma forma totalmente diferente um do outro, na tentativa de obter mais performance, ser mais confiável ou gastar menos memória. Porém o conjunto básico de operações oferecidas pelas agendas é sempre o mesmo. Isso facilita a vida do usuário pois se ele tiver que trocar de celular não vai ter que aprender novamente como usar uma agenda de contatos. Essa é a grande vantagem em se pensar em interface. Mantida a interface, podemos trocar uma agenda que não é tão eficiente ou que já não atende mais as nossas necessidades por outra mais eficiente ou adequada, sem problemas em ter de aprender a usar a nova agenda: troca-se a implementação, mas não mudamos a interface. Uma agenda de celular pode ser vista como uma estrutura de dados. Uma estrutura de dados mantém os dados organizados seguindo alguma lógica e disponibiliza operações para o usuário manipular os dados. É importante, quando programar, não misturar dado e estrutura de dados em uma coisa só. Um dado é uma informação armazenada e estrutura de dados é quem administra os dados. O ideal é que a estrutura de dados seja o mais independente possível dos dados que ela vai armazenar. Desta forma pode-se aproveitar a mesma estrutura de dados para diversos tipos de dados. Por exemplo, é melhor ter uma agenda genérica do que uma agenda de telefones. Uma agenda genérica pode ser utilizada para guardar telefones, ou emails, ou até mesmo guardar uma outra estrutura dentro dela: contatos, que seriam compostos por nome, telefone e email. Algumas estruturas de dados são apenas agrupamentos de dados sem um objetivo de aplicar algum algo- ritmo ou tirar proveito de sua estrutura. Um exemplo seria a estrutura Contato. Algumas outras estruturas são mais espertas e trabalhosas, como a Agenda , assim como Listas Ligadas, Vetores, Tabelas de Espalhamento e outras que veremos no decorrer do texto. Estas estruturas, por sua característica mais complexa e de poder ser reutilizada em outros contextos, devem ser criadas da forma mais independente possível dos dados que estarão dentro dela. Em outras palavras, não devemos misturar a Agenda e o Contato de maneira rígida, para que com isso possamos criar outras Agendas, como por exemplo uma Agenda de Fornecedor.

2.4 - Sobre este texto Este texto vai mostrar a você diversas estruturas de dados, suas vantagens e desvantagens, assim como suas implementações básicas e classes já existentes na biblioteca padrão do Java. Vamos usar recursos do Java como interfaces, generics, exceptions, pacotes e outros. É bom já ter um conhecimento razoável da linguagem e um pouco de orientação a objetos.

Capítulo 2 - Introdução - Sobre este texto - Página 4

CAPÍTULO 3

Armazenamento Sequencial

“A morte do homem começa no instante em que ele desiste de aprender”

  • Albino Teixeira 3.1 - Motivação Todo mundo já experimentou sopa de letrinhas quando criança. Aliás, quando as crianças tomam sopa de letrinhas, elas ficam muito mais interessadas em formar as palavras do que em tomar a sopa. O que chama mais a atenção é que nesta brincadeira de criança aparece um conceito bem interessante de estrutura de dados. Quando a sopa é servida, as letras estão todas espalhadas sem ordem alguma e sem nenhum significado. Quando você escolhe um grupo de letras e as coloca em seqüência formando uma palavra, este grupo de letras ganha um valor semântico, ou seja, ganha um significado. O grupo de letrinhas que você escolhe para formar uma palavra pode conter letras repetidas sem problema nenhum. A única regra é que as letras postas em seqüência devem formar uma palavra existente em alguma língua.

Figura 3.1: Sopa de Letrinhas

As músicas também são exemplos em que a definição de uma seqüência dos elementos agrega valor semântico. Uma música é composta de notas musicais. Quando estas notas estão “espalhadas”, elas não sig- nificam muita coisa. Já quando colocadas em uma seqüência adequada, formam uma música que as pessoas podem apreciar. Além disso, uma mesma nota musical pode aparecer mais de uma vez em uma única música.

Material do Treinamento Algoritmos e Estruturas de Dados com Java

seria assim:

  1. Rafael
  2. Paulo
  3. Ana
  4. Paulo
  5. Ana
  6. Ana

A listagem também deve manter a ordem de pontuação obtidas pelos relatórios dos alunos. Por exemplo, suponha que o Rafael teve pontuação máxima(100) no seu relatório; O Paulo teve pontuação 70 em um relatório e 50 no outro; Ana teve pontuação 60, 40 e 40 nos seus relatórios. Então, a listagem ficaria assim:

  1. Rafael (100)
  2. Paulo (70)
  3. Ana (60)
  4. Paulo (50)
  5. Ana (40)
  6. Ana (40)

Conforme os alunos forem entregando os relatórios, novas entradas serão adicionadas na listagem. Uma nova entrada pode ser inserida em qualquer posição. A posição é definida de acordo com a pontuação do relatório do aluno. Por exemplo, suponha que o Rafael entregou mais um relatório com pontuação 65. A listagem deveria ser atualizada para:

  1. Rafael (100)
  2. Paulo (70)
  3. Rafael (65)
  4. Ana (60)
  5. Paulo (50)
  6. Ana (40)
  7. Ana (40)

Capítulo 3 - Armazenamento Sequencial - O problema da listagem de alunos - Página 7

Material do Treinamento Algoritmos e Estruturas de Dados com Java

Para gastar os créditos obtidos com os relatórios, o aluno deve pedir para retirar uma das suas entradas na listagem. Os créditos são proporcionais a colocação da entrada do aluno na listagem. Por exemplo, se o Paulo quiser gastar uma das suas duas entradas na lista ele deve escolher entre a de 70 pontos a 50 pontos. A de 70 é a segunda da lista e a de 50 é a quinta. Suponha que ele escolha a de 50 pontos então a nova listagem ficaria assim:

  1. Rafael (100)
  2. Paulo (70)
  3. Rafael (65)
  4. Ana (60)
  5. Ana (40)
  6. Ana (40)

Quando o aluno quiser usar seus créditos ele deve verificar antes se ele tem entradas na listagem. Para isso, ele deve ir na secretaria da instituição. A instituição pode querer saber qual é o aluno que está na primeira posição da listagem ou o que está na última. Na verdade, seria interessante para a instituição poder facilmente saber qual é o aluno que está em qualquer posição que ela queira.

3.3 - Listas Nesta seção, vamos definir uma estrutura de dados para resolver o problema da listagem de alunos. Cha- maremos esta estrutura de Lista. Vimos que uma estrutura de dados deve definir duas coisas:

  1. A maneira como a informação será armazenada.
  2. A interface de uso com o usuário.

Nos dois próximos capítulos, veremos as principais implementações de Listas. Cada implementação tem uma maneira particular de armazenar os dados, que trará vantagens e desvantagens em determinados casos, em termos de uso de memória e tempo consumido para cada operação. Cabe a você conhecer esses casos e saber fazer a melhor escolha conforme o problema enfrentado. Neste capítulo, definiremos apenas a interface de uso que a Lista deve fornecer ao usuário. Com certeza, vamos querer adicionar elementos então precisamos de algumas operações de adição. Talvez duas operações já sejam suficientes, uma que permita adicionar um elemento no fim da Lista e outra que deixe o usuário escolher a posição onde ele quer adicionar um elemento. Também, precisaremos recuperar elementos então vamos definir uma operação que dado uma posição da Lista ela devolve o elemento que está lá. Outro tipo de operação necessária é o de remover elementos. Esta operação deve receber a posição do elemento que deve ser removido.

Capítulo 3 - Armazenamento Sequencial - Listas - Página 8

Material do Treinamento Algoritmos e Estruturas de Dados com Java

public boolean equals(Object o) { Aluno outro = (Aluno)o; return this.nome.equals(outro.nome); } }

Com a classe Aluno , o sistema é capaz de criar objetos para representar os alunos da instituição. Teremos apenas alguns poucos atributos nessa classe, e alguns pares de getters e setters. Vale lembrar que não é boa prática ter classes que apenas carregam dados: seria mais interessante que Aluno também tivesse métodos de negócio. Perceba que rescrevemos os métodos toString() e equals(Object). O primeiro será útil para imprimir os alunos na tela. O segundo servirá para comparar dois objetos do tipo Aluno, o critério de comparação será os nomes dos alunos. Devemos tomar cuidado no método equals(Object) pois estamos correndo o risco de dois tipos de erro. O primeiro acontece quando a referência recebida no parâmetro não está apontando para um objeto do tipo Aluno. O segundo ocorre quando ou a referência do parâmetro é null ou o atributo nome está null.

3.5 - Exercícios: Armazenamento

  1. Crie um projeto no eclipse chamado ed. Não esqueça de selecionar a opção que separa o código fonte do binário.
  2. Crie um pacote no projeto ed com o nome br.com.caelum.ed.
  3. Faça a classe Aluno no pacote br.com.caelum.ed para poder criar objetos que representarão os alunos.

Capítulo 3 - Armazenamento Sequencial - Exercícios: Armazenamento - Página 10

CAPÍTULO 4

Vetores

“A melhor maneira de fugir do seu problema é resolvê-lo”

  • Robert Anthony

Vamos implementar uma Lista para resolver o problema da listagem de alunos. Lembrando que a inter- face da Lista já foi definida no capítulo de armazenamento sequencial, seguem as operações que devemos implementar:

  1. Adiciona um dado aluno no fim da Lista.
  2. Adiciona um dado aluno em uma dada posição.
  3. Pega o aluno de dada posição.
  4. Remove o aluno de dada posição.
  5. Verifica se um dado aluno está armazenado.
  6. Informa o número de alunos armazenados.

Ainda falta definir como os alunos serão armazenados. Como queremos manter muitos alunos vamos alocar um grande espaço de memória sequencial com capacidade para guardar uma certa quantidade de alunos, talvez 100 alunos por enquanto seja razoável. Para facilitar o acesso aos alunos, dividiremos o espaço de memória alocado em pequenos pedaços idênti- cos. Cada pedaço armazenará um aluno. Além disso, vamos indexar (numerar) os pequenos pedaços para ser fácil recuperar um aluno.

Figura 4.1: Array

Praticamente todas as linguagens de programação têm um recurso similar ao que descrevemos acima. Em Java, este recurso é chamado de Array. Um array é uma porção de memória fixa e sequencial dividida em pedaços idênticos indexados a partir do 0. Em cada posição do array, podemos guardar um aluno. Na verdade, cada posição pode guardar uma referência para um objeto do tipo Aluno. A capacidade de um array é fixa e deve ser informada no momento da criação do array. Não é possível redimensionar um array em Java, teremos de contornar isso mais adiante.

11