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