La introducción a los algoritmos es como el queso azul. Algunas personas lo odian absolutamente, otros lo aman. Es realmente matemáticamente riguroso, ningún detalle dejado atrás. Esto deja a algunas personas aturdidas y confundidas. Personalmente, me pareció mejor saltear inicialmente las matemáticas e intentar entender el algoritmo. (Recomiendo volver a las matemáticas después de haber entendido correctamente el algoritmo)
Personalmente no pude entender algunos algoritmos o incluso argumentar su corrección simplemente leyendo la prueba matemática de corrección o el análisis del tiempo de ejecución. La forma más efectiva que he podido encontrar es rastrear el algoritmo a mano . Esto puede sonar cliché pero funcionó muy bien para mí.
Tomaría un bolígrafo y papel, tomaría algo al azar y me convertiría en la máquina. Ejecutaría cada línea de código a mano, viendo el estado de todas las variables en cada paso, descubriendo cada transición. Luego, repetiría este procedimiento con múltiples entradas hasta que estuviera convencido.
- ¿Por qué necesito el complemento de un gráfico?
- ¿Cómo se puede calcular el número de inversiones entre dos matrices en O (N log N)?
- ¿Las IA modernas sufren los mismos problemas que los algoritmos, o tienen un conjunto diferente de problemas?
- ¿Por qué un algoritmo de búsqueda binaria se considera más importante que la búsqueda lineal menos complicada?
- Un profesor me dijo que no me molestara en aprender muchos lenguajes de programación sino que me enfocara solo en C ++, estructuras de datos y algoritmos, ¿tiene razón?
Una vez que estoy “convencido”, puedo argumentar su corrección y tiempo de ejecución sin siquiera mirar la prueba, pero lo más importante, puedo codificar una implementación correcta sin mirar nuevamente el libro de texto . Ahí es cuando lo has entendido.
Hasta ahora, me referí a tu comentario pero no a tu pregunta como tal. Según lo que puedo decir, estás tratando de entender algunos algoritmos clásicos. Para esto, el mejor recurso que conozco sería HackerRank. Tienen problemas agrupados por categorías e incluso tienen problemas que requieren la implementación de varios algoritmos clásicos como Djikstra o Prim o estructuras de datos como Tries, BST. Entonces, si desea probar sus implementaciones, este es el lugar. Siempre hay editoriales para la mayoría de los problemas en caso de que te quedes estancado.
Pero no recomiendo codificarlo y probarlo si no lo comprende. Para ser honesto, es muy probable que lo entiendas mientras lo pruebas, ver dónde está fallando o pasando te ayudará a tener una intuición de por qué está sucediendo eso, pero luego se convierte en un caso de éxito y prueba . Como todos mis guías / maestros siempre me han dicho, nunca recurra al éxito y al juicio . Te hará daño en algún lugar del camino. Créeme, lo he intentado.
Volviendo a Introducción a los Algoritmos, si encuentra que el texto es insuficiente o poco claro, le recomiendo encarecidamente las conferencias del curso Introducción a Algoritmos de Erik Demaine y Srini Devadas 6.006 del MIT. Este es un curso basado en el libro del mismo nombre. Es un curso brillante, tanto Erik como Srini son excelentes maestros. Erik ocasionalmente puede hacer algunas cosas específicas de Python en el psuedocode, pero para ser honesto, Python no está muy lejos de psuedocode.
MIT 6.006 Introducción a los algoritmos, otoño de 2011
Ahora, si este está un nivel por debajo de lo que está buscando, tal vez esté buscando algo como la optimización del casco convexo o algo más avanzado, no temas, MIT al rescate. Subieron el próximo curso de la serie Algorithms, 6.046, Advanced Algorithms de los mismos profesores (con la incorporación de la Prof. Nancy Lynch )
MIT 6.046J Diseño y Análisis de Algoritmos, Primavera 2015
EDITAR 1 : Como un conjunto de alternativas al contenido del MIT, también puede ver lo siguiente de la Universidad de Stanford.
Un segundo curso en algoritmos (CS261, invierno 2016) (Algoritmos avanzados)
Colección de conferencias | Programación de abstracciones (algoritmos básicos)
Esto debería ser suficiente para la mayoría de los casos. Ahora, por supuesto, si realmente desea practicar el diseño de algoritmos, que puede involucrar algunos algoritmos no clásicos, sino paradigmas de diseño de algoritmos como la Programación dinámica, entonces no hay límites en los recursos. Puede ir a CodeChef o TopCoder o SPOJ u otros cientos de sitios web.
Casi lo olvido. Las páginas de capacitación de USACO son realmente geniales, ¡léalas también!
¡Buena suerte!
PD: Ya sea que estés haciendo solo el libro o el curso MIT, haz las tareas . Aprenda Python si lo necesita para las tareas del curso. No debería tomar más de una semana, y créeme, Python vale más que la pena.