Sumário - Grupo A

Propaganda
Sumário
1
Cartilha de Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.1
2
Tipos básicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
1.1.2
Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
1.1.3
Tipos enumerados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
Métodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
1.3
Expressões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
1.5
1.3.1
Literais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
1.3.2
Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
1.3.3
Conversores e autoboxing/unboxing em expressões . . . . . . .
25
Controle de fluxo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
1.4.1
Os comandos if e switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
1.4.2
Laços . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
1.4.3
Expressões explícitas de controle de fluxo . . . . . . . . . . . . . . .
31
Arranjos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
1.5.1
Declarando arranjos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
1.5.2
Arranjos são objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36
1.6
Entrada e saída simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
1.7
Um programa de exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
1.8
Classes aninhadas e pacotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
45
1.9
Escrevendo um programa em Java. . . . . . . . . . . . . . . . . . . . . . . . . . .
47
1.9.1
Projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
1.9.2
Pseudocódigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
1.9.3
Codificação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
49
1.9.4
Teste e depuração . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
55
Projeto Orientado a Objetos . . . . . . . . . . . . . . . . . . . . . . . . . .
59
2.1
Objetivos, princípios e padrões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
60
2.1.1
Objetivos do projeto orientado a objetos . . . . . . . . . . . . . . . .
60
2.1.2
Princípios de projeto orientado a objetos . . . . . . . . . . . . . . . .
61
2.1.3
Padrões de projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
64
1.10
Goodrich_2_Book.indb xv
1.1.1
1.2
1.4
2
Iniciando: classes, tipos e objetos . . . . . . . . . . . . . . . . . . . . . . . . . . .
21/03/13 08:13
xvi
Sumário
2.2
2.3
2.4
2.5
Herança . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
65
2.2.2
Polimorfismo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
66
2.2.3
Usando herança em Java . . . . . . . . . . . . . . . . . . . . . . . . . . . .
67
Exceções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
77
2.3.1
Lançando exceções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
77
2.3.2
Capturando exceções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
79
Interfaces e classes abstratas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
81
2.4.1
Implementando interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . .
81
2.4.2
Herança múltipla e interfaces . . . . . . . . . . . . . . . . . . . . . . . . .
83
2.4.3
Classes abstratas e tipagem forte . . . . . . . . . . . . . . . . . . . . . .
84
Conversão e genéricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
85
2.5.1
Conversão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
86
2.5.2
Genéricos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
90
92
Índices, Nodos e Recursão . . . . . . . . . . . . . . . . . . . . . . . . . . .
99
3.1
3.2
3.3
3.4
3.5
3.6
Goodrich_2_Book.indb xvi
65
2.2.1
Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.6
3
Herança e polimorfismo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Usando arranjos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
3.1.1
Armazenando os registros de um jogo em um arranjo . . . . . . 100
3.1.2
Ordenando um arranjo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
3.1.3
Métodos de java.util para arranjos e números aleatórios . . . . 110
3.1.4
Criptografia simples com arranjos de caracteres . . . . . . . . . . 113
3.1.5
Arranjos bidimensionais e jogos de posição . . . . . . . . . . . . . . 116
Listas simplesmente encadeadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
3.2.1
Inserção em uma lista simplesmente encadeada . . . . . . . . . . 123
3.2.2
Removendo um elemento em uma lista
simplesmente encadeada . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Listas duplamente encadeadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
3.3.1
Inserção no meio de uma lista duplamente encadeada . . . . . 129
3.3.2
Remoção do meio de uma lista duplamente encadeada . . . . 130
3.3.3
Implementação de uma lista duplamente encadeada . . . . . . . 131
Listas encadeadas circulares e ordenação de
listas encadeadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
3.4.1
Listas encadeadas circulares e a brincadeira do
“Pato, Pato, Ganso”. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
3.4.2
Ordenando uma lista encadeada . . . . . . . . . . . . . . . . . . . . . . . 138
Recursão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
3.5.1
Recursão linear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
3.5.2
Recursão binária . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
3.5.3
Recursão múltipla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
21/03/13 08:13
Sumário
4
Ferramentas de Análise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
4.1
4.2
4.3
4.4
5
As sete funções usadas neste livro . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
4.1.1
A função constante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
4.1.2
A função logaritmo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
4.1.3
A função linear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
4.1.4
A função n-log-n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
4.1.5
A função quadrática. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
4.1.6
A função cúbica e outras polinomiais . . . . . . . . . . . . . . . . . . . 166
4.1.7
A função exponencial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
4.1.8
Comparando taxas de crescimento. . . . . . . . . . . . . . . . . . . . . 169
Análise de algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
4.2.1
Estudos experimentais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
4.2.2
Operações primitivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
4.2.3
Notação assintótica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
4.2.4
Análise assintótica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
4.2.5
Usando a notação O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
4.2.6
Um algoritmo recursivo para calcular potência . . . . . . . . . . . . 183
4.2.7
Exemplos extras de análise de algoritmos . . . . . . . . . . . . . . . 184
Técnicas simples de justificativa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
4.3.1
Por meio de exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
4.3.2
O ataque “contra’’ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
4.3.3
Indução e invariantes em laços . . . . . . . . . . . . . . . . . . . . . . . . 190
Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Pilhas e Filas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
5.1
5.2
5.3
Goodrich_2_Book.indb xvii
xvii
Pilhas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
5.1.1
O tipo abstrato de dados pilha . . . . . . . . . . . . . . . . . . . . . . . . 203
5.1.2
Uma implementação de uma pilha baseada em arranjos . . . . 205
5.1.3
Implementando uma pilha usando uma lista
encadeada genérica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
5.1.4
Invertendo um arranjo usando uma pilha . . . . . . . . . . . . . . . . 213
5.1.5
Verificando parênteses e tags HTML . . . . . . . . . . . . . . . . . . . . 214
Filas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
5.2.1
O tipo abstrato de dados fila . . . . . . . . . . . . . . . . . . . . . . . . . . 218
5.2.2
Uma implementação simples baseada em arranjos . . . . . . . . 221
5.2.3
Implementando uma fila usando uma lista
encadeada genérica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
5.2.4
Escalonadores round-robin . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Filas com dois finais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
5.3.1
O tipo abstrato de dados deque . . . . . . . . . . . . . . . . . . . . . . . 227
5.3.2
Implementando um deque . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
21/03/13 08:13
xviii
Sumário
5.3.3
5.4
6
Listas e Iteradores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
6.1
6.2
6.3
6.4
6.5
6.6
7
Listas arranjo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
6.1.1
O tipo abstrato de dados lista arranjo . . . . . . . . . . . . . . . . . . . 238
6.1.2
O padrão adaptador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
6.1.3
Uma implementação simples usando arranjo . . . . . . . . . . . . . 240
6.1.4
A interface simples e a classe java.util.ArrayList . . . . . . . . . . . 242
6.1.5
Implementando uma lista arranjo usando arranjos
extensíveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
Listas de nodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
6.2.1
Operações baseadas em nodos . . . . . . . . . . . . . . . . . . . . . . . 247
6.2.2
Posições . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
6.2.3
O tipo abstrato de dados lista de nodos . . . . . . . . . . . . . . . . . 248
6.2.4
Implementação usando lista duplamente encadeada . . . . . . . 252
Iteradores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
6.3.1
Os tipos abstratos de dados iterador e iterável . . . . . . . . . . . . 257
6.3.2
O laço de Java para-cada . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
6.3.3
Implementando iteradores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
6.3.4
Iteradores de lista em Java . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Os TADs de lista e o framework de coleções. . . . . . . . . . . . . . . . . . . 263
6.4.1
Listas no framework de coleções de Java. . . . . . . . . . . . . . . . 263
6.4.2
Sequências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Estudo de caso: a heurística mover-para-frente . . . . . . . . . . . . . . . . 269
6.5.1
Usando uma lista ordenada e uma classe aninhada . . . . . . . . 270
6.5.2
Usando uma lista com a heurística mover-para-frente . . . . . . 272
6.5.3
Possíveis usos de uma lista de favoritos . . . . . . . . . . . . . . . . . 274
Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Árvores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
7.1
7.2
7.3
Árvores genéricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
7.1.1
Definição de árvore e propriedades . . . . . . . . . . . . . . . . . . . . . 284
7.1.2
O tipo abstrato de dados árvore . . . . . . . . . . . . . . . . . . . . . . . 287
7.1.3
Implementando uma árvore . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Algoritmos de caminhamento em árvores . . . . . . . . . . . . . . . . . . . . . 290
7.2.1
Altura e profundidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
7.2.2
Caminhamento prefixado . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
7.2.3
Caminhamento pós-fixado . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Árvores binárias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
7.3.1
Goodrich_2_Book.indb xviii
Deques no framework de coleções de Java . . . . . . . . . . . . . . 230
Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
O TAD árvore binária . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
21/03/13 08:13
Sumário
7.4
8
8.2
8.3
8.4
8.5
Uma interface de árvore binária em Java . . . . . . . . . . . . . . . . 302
7.3.3
Propriedades de árvores binárias . . . . . . . . . . . . . . . . . . . . . . 302
7.3.4
Estruturas encadeadas para árvores binárias . . . . . . . . . . . . . 304
7.3.5
Uma estrutura baseada em lista arranjo para árvores
binárias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
7.3.6
Caminhamentos sobre árvores binárias . . . . . . . . . . . . . . . . . 315
7.3.7
O padrão do método modelo . . . . . . . . . . . . . . . . . . . . . . . . . 322
Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
O tipo abstrato de dados fila de prioridade . . . . . . . . . . . . . . . . . . . . 338
8.1.1
Chaves, prioridades e relações de ordem total . . . . . . . . . . . . 338
8.1.2
Entradas e comparadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
8.1.3
O TAD fila de prioridade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
8.1.4
Ordenando com uma fila de prioridade . . . . . . . . . . . . . . . . . . 342
Implementando uma fila de prioridade com listas . . . . . . . . . . . . . . 343
8.2.1
Implementação de uma fila de prioridade em Java
usando uma lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
8.2.2
Selection sort e insertion sort . . . . . . . . . . . . . . . . . . . . . . . . . 347
Heaps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
8.3.1
A estrutura de dados heap . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
8.3.2
Árvores binárias completas e suas representações . . . . . . . . 352
8.3.3
Implementando uma fila de prioridade com um heap . . . . . . . 357
8.3.4
Implementação em Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
8.3.5
Heapsort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
8.3.6
Construção bottom-up do heap . . . . . . . . . . . . . . . . . . . . . . 367
Filas de prioridade adaptáveis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
8.4.1
Usando a classe java.util.PriorityQueue . . . . . . . . . . . . . . . . . 371
8.4.2
Entradas conscientes de localização. . . . . . . . . . . . . . . . . . . . 372
8.4.3
Implementando uma fila de prioridade adaptável . . . . . . . . . . 374
Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
Tabelas de Hash, Mapas e Skip Lists . . . . . . . . . . . . . . . . . . . 385
9.1
9.2
Goodrich_2_Book.indb xix
7.3.2
Heaps e Filas de Prioridade . . . . . . . . . . . . . . . . . . . . . . . . . . 337
8.1
9
xix
Mapas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
9.1.1
O TAD mapa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
9.1.2
Uma implementação simples de mapa . . . . . . . . . . . . . . . . . . 388
Tabelas de hash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
9.2.1
Arranjo de buckets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
9.2.2
Funções de hash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
9.2.3
Códigos de hash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
9.2.4
Funções de compressão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
21/03/13 08:13
xx
Sumário
9.3
9.4
9.5
9.6
10
10.2
10.3
10.4
10.5
10.6
Uma implementação Java para tabelas de hash . . . . . . . . . . . 400
9.2.7
Fatores de carga e rehashing. . . . . . . . . . . . . . . . . . . . . . . . . . 404
9.2.8
Aplicação: contador de frequência de palavras . . . . . . . . . . . 405
Mapas ordenados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
9.3.1
Tabelas de pesquisa ordenada e pesquisa binária . . . . . . . . . 407
9.3.2
Duas aplicações de mapas ordenados . . . . . . . . . . . . . . . . . . 411
Skip list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
9.4.1
Operações de pesquisa e atualização em uma skip list . . . . . 416
9.4.2
Uma análise probabilística das skip lists . . . . . . . . . . . . . . . 420
Dicionários. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
9.5.1
O TAD Dicionário . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
9.5.2
Implementações com entradas preocupadas
com a localização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
9.5.3
Implementação usando o pacote java.util . . . . . . . . . . . . . . . . 425
Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
Árvores binárias de pesquisa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
10.1.1
Pesquisa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
10.1.2
Operações de atualização . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
10.1.3
Implementação Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
Árvores AVL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
10.2.1
Operações de atualização . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
10.2.2
Implementação Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
Árvores espalhadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
10.3.1
Espalhamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
10.3.2
Quando espalhar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459
10.3.3
Análise amortizada do espalhamento . . . . . . . . . . . . . . . . . 462
Árvores (2,4). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468
10.4.1
Árvore genérica de pesquisa . . . . . . . . . . . . . . . . . . . . . . . . . . 468
10.4.2
Operações de atualização em árvores (2,4). . . . . . . . . . . . . . . 473
Árvores vermelho-pretas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
10.5.1
Operações de atualização . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
10.5.2
Implementação Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
Ordenação, Conjuntos e Seleção . . . . . . . . . . . . . . . . . . . . . . 505
11.1
Goodrich_2_Book.indb xx
Esquema para tratamento de colisões . . . . . . . . . . . . . . . . . . 396
9.2.6
Árvores de Pesquisa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
10.1
11
9.2.5
Merge-sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
11.1.1
Divisão e conquista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
11.1.2
Junção de arranjos e listas . . . . . . . . . . . . . . . . . . . . . . . . . . . 511
21/03/13 08:13
Sumário
11.2
11.3
11.4
11.5
11.6
12
11.1.3
O tempo de execução do merge-sort . . . . . . . . . . . . . . . . . . . 512
11.1.4
Implementações Java do merge-sort . . . . . . . . . . . . . . . . . . . 514
11.1.5
O merge-sort e suas relações de recorrência . . . . . . . . . . . 517
Quick-sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
11.2.1
Quick-sort randômico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
11.2.2
Implementações e otimizações de Java . . . . . . . . . . . . . . . . . 527
Estudando ordenação através da visão algoritmica . . . . . . . . . . . . . 530
11.3.1
Um limite inferior para ordenação . . . . . . . . . . . . . . . . . . . . . . 531
11.3.2
Ordenação em tempo linear: Bucket-sort e radix-sort . . . . . . 532
11.3.3
Comparando algoritmos de ordenação . . . . . . . . . . . . . . . . . . 535
Conjuntos e as estruturas union/find . . . . . . . . . . . . . . . . . . . . . . . . . 537
11.4.1
O TAD conjunto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537
11.4.2
Conjuntos de fusão e o padrão do método modelo . . . . . . . . 538
11.4.3
Partições com operações de union-find . . . . . . . . . . . . . . . . . 542
Seleção . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
11.5.1
Poda e busca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
11.5.2
Quick-select randômico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
11.5.3
Analisando o quick-select randômico . . . . . . . . . . . . . . . . . . . 548
Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549
Strings e Programação Dinâmica . . . . . . . . . . . . . . . . . . . . . . 557
12.1
12.2
12.3
12.4
12.5
12.6
Goodrich_2_Book.indb xxi
xxi
Operações com strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558
12.1.1
A classe Java String. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559
12.1.2
A classe Java StringBuffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560
Programação dinâmica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560
12.2.1
Produto em cadeia de matrizes . . . . . . . . . . . . . . . . . . . . . . . . 561
12.2.2
O DNA e alinhamento de sequências de texto . . . . . . . . . . . . 563
Algoritmos para procura de padrões . . . . . . . . . . . . . . . . . . . . . . . . . 567
12.3.1
Força bruta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
12.3.2
O algoritmo Boyer-Moore . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569
12.3.3
O algoritmo de Knuth-Morris-Pratt . . . . . . . . . . . . . . . . . . . . . 573
Compressão de textos e o método guloso . . . . . . . . . . . . . . . . . . . . 578
12.4.1
O algoritmo de codificação de Huffman . . . . . . . . . . . . . . . . . 579
12.4.2
O método guloso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580
Tries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
12.5.1
Tries padrão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
12.5.2
Tries comprimidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584
12.5.3
Tries de sufixos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586
12.5.4
Mecanismos de busca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589
21/03/13 08:13
xxii
Sumário
13
Algoritmos Grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
13.1
Grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598
13.2
Estruturas de dados para grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603
13.1.1
13.3
13.4
13.5
13.6
13.7
14
O TAD grafo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602
13.2.1
A lista de arestas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603
13.2.2
A lista de adjacências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606
13.2.3
A estrutura da matriz de adjacência . . . . . . . . . . . . . . . . . . . . 608
Caminhamento em grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610
13.3.1
Pesquisa em profundidade . . . . . . . . . . . . . . . . . . . . . . . . . . . 610
13.3.2
Implementando a pesquisa em profundidade . . . . . . . . . . . . . 614
13.3.3
Caminhamento em largura. . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
Grafos dirigidos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626
13.4.1
Caminhamento em um dígrafo . . . . . . . . . . . . . . . . . . . . . . . . 627
13.4.2
Fechamento transitivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630
13.4.3
Grafos acíclicos dirigidos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
Caminhos mínimos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
13.5.1
Grafos ponderados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637
13.5.2
O algoritmo de Dijkstra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638
13.5.3
Uma implementação alternativa do algoritmo de Dijkstra . . . . 644
Árvores de cobertura mínima . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647
13.6.1
Algoritmo de Kruskal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649
13.6.2
O algoritmo Prim-Jarník . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653
Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656
Memória . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667
14.1
14.2
14.3
14.4
Gerenciamento de memória . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668
14.1.1
Pilhas na máquina virtual de Java . . . . . . . . . . . . . . . . . . . . . . 668
14.1.2
Alocando espaço na memória heap . . . . . . . . . . . . . . . . . . . . 671
14.1.3
Coleta de lixo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673
Memória externa e caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
14.2.1
A hierarquia de memória . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
14.2.2
Estratégias de cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677
Pesquisa externa e árvores B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681
14.3.1
Árvores (a,b) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682
14.3.2
Árvores B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684
Ordenando memória externa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685
14.4.1
14.5
Merge genérico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686
Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
A Fatos Matemáticos Úteis . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691
Bibliografia. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699
Índice. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705
Goodrich_2_Book.indb xxii
21/03/13 08:13
Download