MAC323 Algoritmos e estruturas de dados II
[Edição do 1o. Semestre de 2015]
(Página eternamente minimal e em mutação)
Transparências de Sedgewick e Wayne (cópia local)
Sinopse das aulas
Fevereiro
- informações gerais Apresentação da disciplina: objetivos e importância. Núcleo: estruturas de dados e algoritmos. Papel importante: abstração. Orientação a objetos; Java. Bibliografia. O sistema Java de S&W. Tópicos administrativos:
- http://docs.oracle.com/javase/8/ e
http://docs.oracle.com/javase/tutorial/index.html. Anatomia de um
programa Java:
BinarySearch.java
(veja no sandbox). Alguns conceitos: bibliotecas Java, bibliotecas de S&W;main()
, métodos (estáticos), métodos da classe e de outras classes. Execução do programa. Java crash course. Capítulos 1 e 2 de S&W, Introduction to programming in Java (veja a página do livro e as transparências).
Breve introdução ao Java. Páginas da Oracle:
Março
- página do
livro e as transparências). Exemplos de uso do
StdDraw
(imagens e mouse),StdAudio
(GuitarHero).
Java crash course (continuação). Capítulos 1 e 2
de S&W, Introduction to programming in Java (veja a - (Professor não pôde dar aula [estava sem voz…])
- Bibliotecas e clientes. Exemplos: IFS e Bernoulli. Sumário (de Algorithms, 4th ed.). Elementos de POO. Tipos de dados; abstração; uso: Seção 3.1 de IntroCS. Java crash course (continuação). Métodos estáticos em Java.
String
. (Veja a observação sobre a mudança da implementação desubstring()
no OpenJDK Java 7, Update 6, nesta página; veja também este artigo). As classesIn
eOut
de S&W. Implementação de classes: Seções 3.2 e 3.3 de IntroCS. Veja também Algs4th.
Elementos de POO. A classe - Pilhas e filas (recordação). Implementação com listas ligadas e vetores (implementações com resizing; análise amortizada). Java generics. Uma aplicação de pilhas: avaliação de expressões infixas/pósfixas (algoritmo de Dijkstra).
- Seção 3.6 de IntroCS; método de Newton). Iteradores. Novamente Newton: bacias de Newton; veja o Creative Exercise 3.2.15 de IntroCS. (Para ler mais sobre subtipagem por herança e por interface, veja, por exemplo, este documento.) Avaliação de expressões infixas/pósfixas (algoritmo de Dijkstra; continuação; versão deluxe). Subtipagem por interfaces (
\Theta
,O
e\Omega
; recursos envolvidos: tempo e espaço (memória). Busca binária: veja este link.
Análise de algoritmos. Exemplo: o problema do
3SUM. Análise experimental; doubling; modelos matemáticos; modelo
de custo; notação "~"; ordem de grandeza (ordem de crescimento);
notação - Union-find. Versões elementares: quick-find e quick-union. Melhoramento substancial: weighted quick-union (variantes: baseadas em altura e "posto"). Melhoramento adicional: compressão de caminhos; versões: de uma varredura e de duas varreduras (versão iterativa e versão recursiva). Aplicação: percolação 2D.
- Semana Santa
- Semana Santa
Abril
Comparable
. Implementações elementares e binary heaps. Exemplo de aplicação: simulações regidas por eventos (event-driven simulation).
Filas de prioridade. API. Uso de chaves que
estendem - tipos genéricos e bounded
type parameters (uso de
extends
em type parameters: veja, p. ex., este link). Para implementar interfaces, usamosimplements
; veja, p. ex., a seção do tutorial da Oracle. (Para os que querem saber mais: veja a aula Interfaces e herança do tutorial.) Filas de prioridade (continuação). Exemplo de aplicação: simulações regidas por eventos (continuação). Se você quer saber o que énull
: veja aqui.
Breve discussão sobre - immutability em
Algs4th (ou a aula no tutorial). Em particular, veja a
implementação da classe
Vector
. Exemplos de tipos mutáveis:Counter
,Accumulator
eVisualAccumulator
(veja em Algs4th). Um exercício com filas de prioridade: Taxicab numbers. Um exercício de union-find: pior caso de quick-union com pesos. Exercícios de análise de algoritmos (veja a abundância de exercícios em Algs4th). Exercícios de pilhas e filas (idem).
Tipos imutáveis de dados; veja - p1.pdf | p1b.pdf] P1 [
- Feriado
Person.java
eDate.java
). Implementações elementares (veja emsandbox/2015.04.23
). Chaves comparáveis e tabelas de símbolos ordenadas. Operações ordenadas (operações que dependem do fato de as chaves virem de um conjunto totalmente ordenado). Árvores binárias (ABs) e árvores binárias de busca (ABBs). Para uma implementação, veja novamente no sandbox (ou em Algs4th).
Tabelas de símbolos. API. Detalhe: testes de
igualdade (veja, p. ex., - Semana de break
- Semana de break
Maio
- Aula cancelada (professor fora do estado)
- veja estas notas].
Algumas operações ordenadas (
rank()
,select()
e varredura/iteração ordenada). Remoção de ABBs. Árvores binárias de busca balanceadas (ABBB) (introdução). Árvores 2-3. Árvores rubro-negras esquerdistas (introdução).
Árvores binárias de busca (continuação). O
formato de uma ABB e o formato de ABs uniformes [ put()
: BSTs e LLRBs (classe auxiliar:VisualAccumulator.java
).
LLRB Árvores rubro-negras esquerdistas
(continuação). Algoritmo de inserção. Contagem experimental de
comparações em execuções de - Algs4th. Veja também estas transparências de
Sedgewick (veja também esses videos; uma versão posterior/editada
dessas transparências estão também disponíveis). Tabelas de
espalhamento (hashing). O método
hashCode()
e funções de espalhamento (hashing); redução móduloM
. Resolução de colisões por encadeamento.
Remoção em árvores LLRB: veja Creative problems 3.3.39,
3.3.40 e 3.3.41 de SET
. Whitelisting e blacklisting. Consulta a dicionários dados por arquivos csv.
Tabelas de espalhamento (continuação). Resolução
de colisões por probing linear. Variantes. Aplicações de tabelas
de símbolos. API para - Aplicações de tabelas de símbolos (continuação). Contagem de ocorrências de palavras em texto. Arquivos invertidos: indexação de arquivos, de páginas web, de uma biblioteca digital, criação de índices remissivos de livros. Vetores esparsos.
- esta página, mantida pelo prof. Paulo Feofiloff. A API para manipulação de grafos de Algs4th. Representação de grafos no computador. Busca em profundidade. Grafos. Introdução. Conceitos básicos: além de Algs4th, veja
- Busca em profundidade (continuação). Versão não recursiva de DFS. Busca em largura. Distância em grafos. Componentes conexas e outras aplicações de buscas.
Junho
- Semana de break
- Semana de break (Corpus Christi)
- Grafos dirigidos. Introdução. Noções básicas. A API para grafos dirigidos. Busca em profundidade e busca em largura em grafos dirigidos. Um webcrawler primitivo. Ordenação topológica (introdução).
- Ordenação topológica (continuação). Ordenação topológica a partir de busca de profundidade. Componentes fortemente conexas. O algoritmo de Kosaraju e Sharir.
- Grafos dirigidos com pesos. API para arcos com pesos e API para grafos dirigidos com pesos nos arcos. Caminhos mínimos em grafos com pesos. Algoritmo genérico para caminhos mínimos. Algoritmo de Dijkstra.
- P2
- Algoritmo de Dijkstra (continuação). Caminhos mais curtos e mais longos em DAGs. Comentários sobre o caso de grafos com arcos com pesos negativos. Circuitos negativos. Aplicações.
- (PSub fechada cancelada) Expressões regulares. Autômatos determinísticos (DFA) e não-determinísticos (NFA). Simulação de NFAs. Leia sobre regex golf nesse link:
- Expressões regulares (continuação). Construção de NFAs a partir de expressões regulares. Aplicações de expressões regulares.
Julho
- Compressão de dados. Introdução. Run-length encoding. Códigos de Huffman.
Página principal de MAC323, 1o. semestre de 2015