¿Qué estructuras de datos y algoritmos deben conocer todos los estudiantes de ciencias de la computación / ingeniería?

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:

  • 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.

Depende de tu línea de trabajo realmente. Al igual que las ciencias de la computación / ingeniería, los estudiantes que desean trabajar en Machine Learning y AI, serían diferentes a los que trabajan en los campos financieros, que aquellos que buscan desarrollo de aplicaciones / software, desarrollo de juegos.

Pero en términos básicos, te recomiendo que eches un vistazo a lo que más te interesa.

Estructuras de datos:

  • Matrices
  • Listas enlazadas
  • Arboles binarios
  • Tablas hash
  • Montón binario
  • Gráficos
  • Intentos

Tipos de datos abstractos:

  • Apilar
  • Cola
  • Mapa / Diccionario
  • Cola de prioridad

Algoritmos

  • Búsqueda binaria
  • Mergesort
  • Profundidad primera búsqueda
  • Búsqueda gráfica de Dijkstra
  • Una búsqueda
  • Shuffle de Fisher-Yates