CS-14 | Algoritmos e Estrutura de Dados em Java
[ 40 horas aula ]
Esse curso foi montado ao longo dos 4 anos que ministramos o curso de Estrutura de Dados e Algoritmos em Java nos cursos de verão da USP.
Todos os tipos de aplicações (desktop, web, distribuída ou mobile) guardam dados para processá-los. O desempenho dessas aplicações depende muito da forma que os dados são armazenados. O conhecimento sobre as diversas estruturas de dados é de uso fundamental para o bom desenvolvedor. Esse curso apresenta o funcionamento interno das principais estruturas de dados e os algoritmos para manipulá-las. O foco é mostrar quais são as vantagens e desvantagens de cada estrutura e em que situações usá-las.
O curso também aborda o framework de Collections do Java, onde há implementações semelhantes das diversas estrutura de dados apresentadas. Desta forma, o desenvolvedor apenas precisa ter o discernimento para escolher qual estrutura usar dependendo do tipo de problema que ele está resolvendo. Esse discenimento é obtido através do conhecimento mais profundo dessas estruturas.
Vamos do Vector e ArrayList até o HashSet e HashMap, passando por tópicos como equals e hashCode, comparando a performance dos algoritmos em relação ao consumo de tempo. Todas essas estruturas de dados serão implementadas do zero, de maneira similiar às que existem no java.util. Problemas comuns em que as soluções usam destas estruturas são apresentados e dicutidos. Boas práticas de OO, como o uso de interface, generics e encapsulamento, são vistas no decorrer da criação das estruturas

Pré-requisitos: Curso FJ-11 ou: linguagem Java, variáveis primitivas e orientação a objetos, tratamento de erro, conhecimentos fundamentais de Java SE.
Conteúdo detalhado do CS-14
Download da apostila do CS-14Prefácio
Introdução
- Introdução
- Algoritmo e Implementação
- Estrutura de Dados
- Sobre este texto
Armazenamento Sequencial
- Motivação
- O problema da listagem de alunos
- Listas
- Modelagem
- Exercícios: Armazenamento
Vetores
- Os testes primeiro
- Operações em vetores
- Adicionar no fim da Lista
- O método toString() para o Vetor
- Informar o tamanho da Lista
- Verificar se um aluno está presente no vetor
- Pegar o aluno de uma dada posição do array
- Adicionar um aluno em uma determinada posição do array
- Remover um aluno de uma dada posição
- Alocação Dinâmica
- Generalização
- API do Java
- Exercícios: Vetores
- Exercícios opcionais
Listas Ligadas
- Solução clássica de Lista Ligada
- Célula e Lista Ligada
- Definindo a interface
- Testes
- Operações sobre uma Lista
- Adicionando no começo da Lista
- Adicionando no fim da Lista
- Percorrendo nossa Lista
- Adicionando em qualquer posição da Lista
- Pegando um elemento da Lista
- Removendo do começo da Lista
- Removendo do fim da Lista
- Removendo de qualquer posição
- Verificando se um elemento está na Lista
- O tamanho da Lista
- Lista Duplamente Ligada
- Adicionando no começo da Lista
- Adicionando no fim da Lista
- Adicionando em qualquer posição da Lista
- Removendo do começo da Lista
- Removendo do fim da Lista ou de qualquer posição
- API
- Exercícios: Lista Ligada
Pilhas
- Introdução
- Solução do problemas das Peças
- Operações em pilhas
- Inserir uma peça
- Remover uma peça
- Informar se a pilha está vazia
- Generalização
- API do Java
- Escapando do Labirinto
- Exercícios: Pilha
Filas
- Introdução
- Interface de uso
- Operações em Fila
- Inserir uma aluno
- Remover um aluno
- Informar se a Fila está vazia
- Generalização
- API do Java
- Exercícios: Fila
Armazenamento sem repetição com busca rápida
- Motivação
- O problema do vocabulário
- Conjuntos
Tabelas de Espalhamento
- Introdução
- Tabela de Espalhamento
- Função de Espalhamento
- Operações necessárias
- Adicionar uma palavra
- Remover uma palavra
- Verificar se uma palavra está ou não no Conjunto
- Recuperar todas as palavras do Conjunto
- Informar o tamanho do Conjunto de palavras
- Exercícios: Tabela de Espalhamento 1
- Diminuindo Colisões
- Espalhando Melhor
- Exercícios: Tabela de Espalhamento 2
- Tabela Dinâmica
- Exercícios: Tabela de Espalhamento 3
- Generalização
- equals e hashCode
- Parametrizando o Conjunto
- API do Java
- Exercícios: Tabela de Espalhamento 4
Armazenamento Associativo
- Motivação
- Mapa
- Exercícios: Armazenamento Associativo
Mapas com Lista
- Introdução
- Operações em mapas
- Adicionar uma associação
- Recuperar o valor associado a uma dada chave
- Remover a associação que contem uma determinada chave
- Verificar se uma dada chave está em alguma associação
- Informar o tamanho do Mapa
- Exercícios: Mapas
Mapas com Espalhamento
- Introdução
- Operações
- Verificando se uma chave existe
- Removendo uma associação dado uma chave
- Adicionando uma associação dado uma chave
- Recuperando o valor associado a uma determinada chave
- Performance das operações
- Generalização e Parametrização
- API do Java
* Os apêndices listados são conteúdos adicionais que não fazem parte do curso regular.

