¿Qué algoritmos básicos debe saber un programador promedio?

Eche un vistazo a esta respuesta de Brian Bi a una pregunta muy similar [enlace directo al final del texto].

La programación dinámica (DP) parece dar cuenta de una pluralidad (algunos estiman hasta un tercio) de los problemas del concurso. Por supuesto, DP tampoco es un algoritmo único que solo puede aprender una vez y retener, por lo que tal vez esto no responda a su pregunta.

Supongo que también depende de si considera las estructuras de datos en la misma categoría que los algoritmos. Ciertamente, hay algunas estructuras de datos con las que debería estar familiarizado si desea tener éxito en la programación de competencias. Los más importantes son los árboles de rango (conocidos también como árboles de intervalo o árboles de segmento) y los árboles indexados binarios (BIT), también conocidos como árboles Fenwick. Además, muchos algoritmos DP hacen uso de una matriz de suma de prefijos.

Los algoritmos más esenciales que se me ocurren son los siguientes, sin ningún orden en particular. Sin embargo, es posible que se sienta decepcionado por la poca frecuencia con que algunos de estos aparecen en los concursos. La mayoría de los problemas que no son DP parecen ser de la variedad ” ad hoc con estructuras de datos”, y simplemente tiene que practicar para ser bueno en ellos.

(Para ser claros, nuevamente, enumero a continuación solo los algoritmos que toman un solo conjunto de entrada, calculan alguna función del mismo y no llevan estado entre las entradas. Esto los distingue de las estructuras de datos, que por definición mantienen el estado, y las categorías de algoritmos y técnicas algorítmicas como DP, que no tienen alguna función específica que calculan).

  • Tamiz de Eratóstenes, u otro tamiz de números primos
  • Búsqueda de profundidad primero
  • Búsqueda de amplitud
  • Algoritmo de Dijkstra
  • Algoritmo de Floyd-Warshall
  • Ya sea el algoritmo de Kruskal o Prim
  • Alguna implementación de la clasificación topológica, como mediante el uso de DFS
  • Casco convexo (recomiendo el algoritmo de cadenas monótonas)
  • Compresión coordinada
  • Edmonds – Karp, u otra implementación del método Ford – Fulkerson; o un algoritmo de flujo previo; o, si está preparando un libro de códigos ACM, el algoritmo de Dinic. (Nota: no se permite que el flujo máximo aparezca en el IOI, pero puede aparecer en los concursos de selección de equipos nacionales)

La respuesta de Brian Bi a ¿Cuáles son los 10 algoritmos que uno debe conocer para resolver la mayoría de los problemas de algoritmos?

La mayoría, si no todos, los “algoritmos básicos” se abstraen en 4GL, incluido .Net. Las áreas de aprendizaje que creo que son más aplicables a 4GLs, además de aprender los marcos centrales, son el aprendizaje de algoritmos avanzados, arquitecturas, patrones de diseño, principios SÓLIDOS (para idiomas OO), expresiones idiomáticas, etc.

Todos ellos.

Los algoritmos básicos son bloques de construcción. Si quieres ser más que un programador “promedio”, necesitas profundidad.