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 e 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 primaria 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 praticas. 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 maquinas 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.
Acredito que este livro já é um clássico no Brasil. Esta nova ediçã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, Junho de 2010