El libro está estructurado en siete capítulos. El primero, la complejidad de los algoritmos, está dedicado a analizar algoritmos desde el punto de vista de su eficiencia.
Cubre tanto el cálculo del número de operaciones elementales de los programas como el estudio de sus casos peor, mejor y medio y las cotas asintóticas de crecimiento. Este capítulo también comprende la resolución de ecuaciones en recurrencia, que permiten determinar la eficiencia de los algoritmos recursivos.
En el segundo capítulo presentamos los principales algoritmos de ordenación. Debido a su extensión y a la importancia que en otros ámbitos adquiere el problema de ordenación hemos decidido dedicarle un capítulo independiente, aún a sabiendas de que cualquier algoritmo de ordenación obedece a alguna técnica de diseño, y por tanto podía haberse estudiado en un capítulo posterior.
Por la naturaleza de la materia tratada en estos dos primeros capítulos, decidimos darle una estructura al estilo de la bibliografía usual. La mayoría de los textos presentan los conceptos teóricos básicos, desarrollan un número reducido de problemas ya clásicos, y dejan al lector una amplia colección de problemas sin resolver. Sin embargo, no hemos querido quedamos solamente ahí.
Uno de nuestros objetivos ha sido que nada debe quedar propuesto y no resuelto, y por ello ofrecemos la solución a todos los problemas planteados. Esto permite ejercitar los conocimientos adquiridos, aclarar algunos de los conceptos estudiados y plantear variaciones sobre los métodos.
Los capítulos tercero al séptimo describen y desarrollan las principales técnicas de diseño de algoritmos. Estos cinco capítulos forman el núcleo principal del libro, y están estructurados de la misma forma. Cada tema comienza con una breve introducción teórica en la que se exponen los fundamentos de la técnica tratada y el tipo de problemas que resuelve.
En segundo lugar se presenta un esquema o método general de funcionamiento de los algoritmos que produce dicha técnica. A continuación se desarrolla una colección de problemas que permiten mostrar las distintas formas de aplicación de la técnica estudiada.
Conforme se avanza en los problemas se discuten los pormenores de su diseño y los detalles de implementación, algo normalmente muy descuidado por otros autores pero que sin embargo nosotros consideramos fundamental.
Por eso hemos desarrollado los ejemplos hasta el final, tratando de no dejar ningún cabo suelto; nuestra experiencia nos muestra que tras un esquema de resolución aparentemente sencillo se pueden ocultar serios problemas de implementación a la hora de codificarlo. Y un problema no está resuelto hasta que el algoritmo que lo soluciona no finaliza su ejecución, y en un tiempo razonable.
Disponer de una amplia gama de problemas permite al lector observar de forma muy completa el funcionamiento de cada una de las técnicas, sus ventajas e inconvenientes, y lo que es más importante, a través de estos ejemplos es posible introducir de manera natural y justificada los conceptos más relevantes de cada técnica.
Otra ventaja que ofrece este trabajo frente a otros textos existentes es la utilización de un lenguaje de programación concreto, en este caso Modula-2. Aunque es cierto que el uso de pseudo-código permite la independencia de los algoritmos desarrollados frente a una máquina o compilador concreto, desde nuestro punto de vista se pierden dos aspectos fundamentales.
Por un lado el uso de un pseudo-código puede ocultar algunos detalles de implementación que luego complican la codificación de los programas. Por otro lado, el uso de un lenguaje determinado permite ejecutar los programas obtenidos y así corroborar los resultados previamente calculados de manera teórica, algo que no podemos olvidar en una ciencia aplicada como la algoritmia.
En particular, el uso de Modula-2 se debe a varias razones. Si bien es cierto que cualquier lenguaje imperativo podría ser un candidato válido, sus características en cuanto a modularidad, ocultación y sistema de tipos permiten realizar diseños sencillos y robustos, necesarios para representar con claridad y de forma precisa la estructura de los algoritmos.
Además, los programas resultantes son de fácil comprensión y no plantean serias dificultades para ser traducidos a otros lenguajes imperativos como pueden ser Pascal o C. Por otro lado, también hemos tenido en cuenta que Modula-2 es un lenguaje ampliamente utilizado para la enseñanza de la programación, especialmente en el ámbito universitario.