Dudaría en ser dogmático sobre esto. Ciertamente, hay algunos algoritmos generales y estructuras de datos que son casi omnipresentes: matrices, tablas hash, búsqueda binaria, etc.
Me decepcionaría si un joven graduado en ciencias de la computación no conociera estos elementos básicos, pero en general estoy mucho más interesado en su comprensión de los principios de ingeniería algorítmica y de implementación. Estas son herramientas que permiten al ingeniero exitoso seleccionar o desarrollar soluciones apropiadas para problemas creativos.
En el ámbito de los principios algorítmicos , definitivamente vale la pena conocer lo siguiente:
- ¿Las estructuras de datos y los algoritmos son tan importantes para convertirse en un buen programador?
- ¿Cómo se le ocurrió al autor la fórmula (programación dinámica) en la editorial CIELRCPT - Editorial (Ciel y Receipt)?
- ¿Cuáles son los mejores proyectos de estructura de datos para los estudiantes?
- ¿Cuál es la mayor complejidad de tiempo que cualquier juez en línea puede aceptar como O (10 ^ 9) o algo en términos de números?
- ¿Cómo hacemos que una selección sea estable?
- análisis de complejidad asintótica (notación O, etc.)
- estrategias codiciosas
- estrategias de memorización
- Divide y conquista estrategias
- estrategias / análisis amortizados
- Estrategias de Monte Carlo / análisis probabilístico
Con respecto a los principios de ingeniería de implementación, creo que lo siguiente debe entenderse no solo en principio, sino en el nivel profundo “intestinal”. (Eso requiere algo de práctica).
- Ley de Amdahl
- Jerarquía de memoria
- Ejecución asincrónica (bueno, esta, la parte “intestinal” debería limitarse a “probablemente esté mal, seamos cautelosos”)
Por ejemplo, las realidades de la jerarquía de memoria hacen que las estructuras de datos clásicas, como las listas vinculadas y los árboles de búsqueda binarios, no sean competitivas con las estructuras basadas en matrices, incluso en los casos en que el análisis asintótico pueda sugerir lo contrario. A menudo, agregar un poco de contabilidad encima de una matriz simple realmente puede valer la pena en términos de eficiencia de caché. Consulte, por ejemplo, http://wg21.link/p0447r1 para ver una estructura de datos interesante que resulta de tales consideraciones (diseñada para encajar en la biblioteca estándar de C ++).
Y luego están los principios de ingeniería que no son específicos de los algoritmos y sus implementaciones. Cosas como ingeniería de mantenimiento de software, reutilización de código (con diferentes granularidades), análisis de costos de desarrollo, etc.