xvi
■
Estrutura de Dados e Algoritmos em C++
Este livro dedica-se a estruturas de dados. Outros tópicos são tratados somente quando forem necessários para assegurar um entendimento apropriado deste assunto. Os algoritmos são discutidos da perspectiva das estruturas de dados; o leitor não encontrará uma discussão completa dos diferentes tipos de algoritmos e de todas as facetas que uma apresentação global dos algoritmos exige. No entanto, conforme mencionado, a recursão é coberta em profundidade. Além disso, a análise de complexidade dos algoritmos está apresentada em detalhe. Os Capítulos 1 e 3 a 8 apresentam diferentes estruturas de dados e os algoritmos que operam sobre elas. A eficiência de cada algoritmo é analisada e melhorias para os algoritmos são sugeridas. O Capítulo 1 apresenta os princípios básicos da programação orientada a objetos, uma introdução à alocação dinâmica de memória e o uso de ponteiros, e bem como uma apresentação rudimentar da Biblioteca de Formatos Padrão (em inglês, Standard Template Library – STL). O Capítulo 2 descreve alguns métodos usados para avaliar a eficiência de algoritmos. O Capítulo 3 apresenta os diferentes tipos de listas ligadas, com ênfase em sua implementação com ponteiros. O Capítulo 4 apresenta pilhas e filas e suas aplicações. O Capítulo 5 contém uma discussão detalhada sobre recursão. Seus diferentes tipos são discutidos e uma chamada recursiva é dissecada. O Capítulo 6 discute as árvores binárias, incluindo implementação, percursos e busca. As árvores balanceadas estão também incluídas neste capítulo. O Capítulo 7 detalha árvores mais genéricas, como árvores trie, 2-4 e -B. O Capítulo 8 apresenta grafos. Os Capítulos 9 a 13 mostram diferentes aplicações das estruturas de dados apresentadas nos capítulos anteriores. Nestes capítulos são enfatizados os aspectos de estruturas de dados de cada um dos tópicos considerados. O Capítulo 9 analisa a ordenação em detalhe e apresenta diversos métodos elementares e não elementares. O Capítulo 10 discute as técnicas de hashing mais importantes para busca e pesquisa. Várias técnicas são apresentadas, com ênfase na utilização de estruturas de dados. O Capítulo 11 discute algoritmos de compressão de dados e estruturas de dados. O Capítulo 12 apresenta várias técnicas e estruturas de dados para o gerenciamento de memória. O Capítulo 13 discute vários algoritmos de correspondência de cadeia exata e aproximada. O Apêndice A discute em detalhes a notação O-Grande apresentada no Capítulo 2. O Apêndice B apresenta algoritmos padrão da Biblioteca de Formatos Padrão. O Apêndice C dá uma prova do teorema de Cook e o ilustra com um exemplo estendido. Cada capítulo contém uma discussão do material ilustrada com diagramas e tabelas apropriados. Com exceção do Capítulo 2, todos os outros incluem um estudo de caso — um exemplo estendido que usa as características discutidas no capítulo. Todos os estudos de caso foram testados usando o compilador e o compilador g++ em Unix, exceto o floco de neve de von Koch, que roda em um PC com Visual C++. No fim, acompanhando o texto de cada capítulo há um conjunto de exercícios com diferentes graus de dificuldade. Exceto o Capítulo 2, todos os outros incluem também exercícios de programação e uma bibliografia atualizada da literatura relevante. Os Capítulos 1 a 6 (excluindo as Seções 2.9 e 2.10, 3.4, 6.4.3, 6.7 e 6.8 e 6.10 e 6.11) contêm o material que forma a base de qualquer curso de estruturas de dados. Esses capítulos devem ser estudados em sequência. Os seis capítulos restantes podem ser lidos em qualquer ordem. Um curso de um semestre poderia incluir os Capítulos 1 a 6, 9 e as Seções 10.1 e 10.2. O livro inteiro poderia também ser usado em uma sequência de dois semestres.