Resumen
El libro consta de 11 capítulos, aunque el primero es más bien una introducción (se titula "Introducción a los algoritmos"), y el último trata más bien sobre lo que se puede (y idealmente debería) estudiar a continuación, así como temas que este libro no cubre en su totalidad (como MapReduce, el filtro Bloom, SHA y otros). Entonces, ¿qué cubre este libro? Vamos a analizarlo brevemente.
En primer lugar, el libro habla sobre la complejidad de los algoritmos y la notación "O grande". Y créeme, la gran mayoría de los cursos de programación enseñan habilidades muy especializadas, pero rara vez mencionan la complejidad temporal de los algoritmos o la optimización del código.
En cuanto a los temas tratados, los repasaré rápidamente en este párrafo.
El libro comienza con un capítulo sobre arreglos y listas enlazadas, explicando cómo trabajar con ellos (en términos de ordenación y búsqueda). Enumera las ventajas y desventajas de las listas (desde la perspectiva de velocidad de lectura/escritura y almacenamiento de datos).
Luego hay un capítulo corto sobre recursión, que cubre la pila de llamadas y su funcionamiento.
Después, el libro profundiza en el algoritmo de ordenación rápida (quicksort) utilizando el enfoque "divide y vencerás". Para reforzar la comprensión de este enfoque, el autor proporciona tres ejemplos. Se discute el elemento pivote, y se comparan gráficamente los tiempos de ejecución de diferentes métodos de ordenación (incluyendo los de capítulos anteriores).
La siguiente sección introduce un nuevo tipo de dato—o mejor dicho, una estructura fundamental—las tablas hash. Se describen escenarios donde son útiles (por ejemplo, eliminación de duplicados, caché, modelado de relaciones entre objetos). También se explican los casos de colisiones.
Luego, el libro introduce los grafos como estructura de datos. No, no cubre todos los temas que estudié en "Modelado Matemático", pero al menos aborda lo básico: qué es un grafo, su propósito, aplicaciones y grafos dirigidos vs. no dirigidos. Y como los grafos tratan sobre "caminos", los algoritmos cubiertos incluyen búsqueda en anchura (BFS) y cómo encontrar el camino más corto. Este capítulo también menciona colas y repasa las pilas, explicando FIFO y LIFO—aunque, en mi opinión, esto debería haberse tratado antes. Por cierto, hay dos capítulos dedicados a grafos. Si el primero trata sobre encontrar el camino más corto en grafos no ponderados, el segundo se enfoca en grafos ponderados usando el algoritmo de Dijkstra. Nuevamente, se incluyen varios ejemplos: primero abstractos y luego en código. El algoritmo Bellman-Ford (para grafos con aristas de peso negativo) no se cubre y se deja para estudio independiente.
Hacia el final, el libro aborda problemas y algoritmos menos comunes (en la programación cotidiana). Por ejemplo, discute algoritmos voraces (greedy), enfoques para problemas "imposibles" sin solución algorítmica rápida (problemas NP-completos), programación dinámica (descomponer problemas complejos en subproblemas) y el algoritmo de k-vecinos más cercanos (k-NN) usado en aprendizaje automático.
Características
El libro incluye ilustraciones que ayudan a visualizar y complementar el material. Cada capítulo también contiene entre 5 y 7 preguntas prácticas. La mayoría son conceptuales (aunque algunas incluyen código), y las respuestas se proporcionan al final para autoevaluación. Cada capítulo termina con un "resumen rápido"—un resumen en 4 o 5 oraciones.
El libro tiene unas 300 páginas, y los capítulos son concisos, por lo que es muy probable que quien lo empiece lo termine. Es fácil y rápido de leer.
Conclusión
Un libro excelente para quienes se adentraron en la programación sin formación técnica. Explica varios métodos de ordenación y búsqueda (búsqueda binaria, búsqueda en profundidad y en anchura) en términos sencillos. Cubre el tema crucial de la complejidad algorítmica ("O grande"). Incluso incluye material sobre grafos, algoritmos de caminos más cortos, k-vecinos más cercanos y otros temas fundamentales que todo programador debería conocer, al menos a nivel básico.