Projeto de Algoritmos com Implementações em Java e C++

Um projeto de Nivio Ziviani, Ph.D. Professor Emérito do Departamento de Ciência da Computação Universidade Federal de Minas Gerais
Consultoria em Java e C++ de Fabiano Cupertino Botelho, M.Sc.

Editora: Pioneira Thomson


| Apresentação

Al-Khorezmi nunca pensou que seu apelido, que significa "um nativo de Khorezmi", seria a origem de palavras mais importantes do que ele mesmo, como álgebra, logaritmo e algoritmo. Graças a esse pouco conhecido matemático árabe do século IX, hoje temos conhecimento de conceitos tão básicos quanto o número zero da Índia ou boa parte da matemática desenvolvida na Grécia.

E sobre algoritmos? Algoritmos e estruturas de dados formam o núcleo da ciência da computação, sendo os componentes básicos de qualquer software. Ao mesmo tempo, aprender como programar está intimamente ligado a algoritmos, já que um algoritmo é a abstração de um programa. Logo, aprender algoritmos é crucial para qualquer pessoa que deseja desenvolver software de qualidade.

Paradigmas de programação estão naturalmente associados a técnicas de projeto e disciplinas introdutórias de ciência da computação são usualmente disciplinas de introdução a algoritmos. Inicialmente, a concepção de algoritmos necessita apenas de técnicas básicas de programação. Quando a complexidade dos problemas e sua análise tornam-se importantes, como no caso deste livro, algoritmos requerem lógica, matemática discreta e alguma fundamentação teórica do tipo teoria de autômatos e linguagens formais.

Entretanto, aprender algoritmos não é fácil, uma vez que precisamos ter a combinação correta de conhecimentos matemáticos e de bom senso. Citando Knuth, a melhor teoria é inspirada na prática e a melhor prática é inspirada na teoria. O balanceamento entre teoria e prática é sempre uma tarefa difícil.

Este livro mostra esse balanceamento entre teoria e prática. Os primeiros três capítulos lançam as bases necessárias para um bom projeto de algoritmos: técnicas de projeto, ferramentas de análise e estruturas de dados básicas. Em particular, o Capítulo 2 cobre os principais paradigmas de projeto de algoritmos usados em outros capítulos para diferentes problemas. Paradigmas como indução, recursividade, divisão e conquista ou uso de heurísticas são essenciais a um bom projeto de algoritmos.

Os três capítulos seguintes cobrem os dois problemas algorítmicos mais importantes: ordenação e pesquisa. Para ambos os casos, versões para memória primária e secundária são consideradas. Ordenação e pesquisa em memória secundária formam os pilares para bancos de dados.

Os próximos dois capítulos cobrem dois tipos de estruturas de dados muito importantes: grafos e cadeias. Grafos ocorrem em muitas aplicações práticas. Por outro lado, a pesquisa e a compressão de cadeias de caracteres formam a base para o processamento de documentos e, ultimamente, para as máquinas de busca da Web.

O capítulo final cobre problemas de grande complexidade computacional, em que todos os algoritmos conhecidos requerem tempo exponencial. Uma alternativa para esse problema é encontrar soluções com erro limitado, obtendo o que é chamado de algoritmo aproximado. Assim, trocamos a qualidade da resposta pelo menor tempo de processamento.

Esses três últimos capítulos, juntamente com os demais, ampliam muito o escopo deste livro. Além disso, os exercícios propostos, muitos com soluções, tornam todo o conteúdo um recurso de ensino muito valioso, um verdadeiro livro-texto.

Existem muitas linguagens de programação. Entretanto, nas últimas décadas, a orientação a objetos se tornou o paradigma padrão para o desenvolvimento de software. Todos os algoritmos deste livro foram implementados nas duas linguagens de programação orientadas a objetos mais importantes da atualidade: Java, o padrão multiplataforma da internet, e C++, a escolha usual para aplicações eficientes.

Acredito que este livro já é um clássico no Brasil. Esta nova versão vai fortalecer essa posição para o benefício de todos os professores e estudantes relacionados com o mundo dos algoritmos.

Ricardo Baeza-Yates
Santiago, Chile, Dezembro de 2003
Barcelona, Espanha, Julho de 2006


Produzido por Tambor Comunicação