¿Cuáles son los 30 algoritmos más importantes que debe conocer para la programación competitiva?

A continuación se incluye una lista razonable, y agrego algunos enlaces a una Especialización donde puede aprender sobre esos algoritmos / estructuras de datos y practicar la resolución de problemas: no cubren todo, pero cubren mucho, y hay alrededor de 80 problemas en esos temas

  1. Técnicas generales: algoritmos codiciosos, programación dinámica: docenas de técnicas, divide y vencerás (búsqueda binaria y otras), algoritmos de clasificación, especialmente fusión, ordenación en montón y ordenación rápida, ordenación parcial / elementos top-k en lineal [esperado] hora.
  2. Estructuras de datos: matrices, matrices dinámicas, pilas, colas, deques, árboles, montones, funciones hash y tablas hash que incluyen hash rodante / hash polinomial para cadenas / subcadenas, árboles de búsqueda binarios (treap o splay, incluido el que tiene claves implícitas), árboles de segmento / árbol Fenwick, unión de conjunto disjunto, descomposición sqrt.
  3. Gráficos: exploración – DFS / BFS, caminos más cortos – Dijkstra, Bellman-Ford, Floyd-Warshall, árboles de expansión – Prim’s, Kruskal’s, flujos – Ford-Fulkerson, Edmonds-Karp, min-cost-max-flow, clasificación topológica y fuerte componentes conectados, 2-SAT, LCA, puentes y puntos de articulación, ciclo euleriano, gráficos biconnectados: 2 colores, coincidencia.
  4. Cadenas: KMP, función Z, polinomio hash rodante, matriz de sufijo, árbol de sufijo o autómata de sufijo.
  5. Álgebra / Teoría de números: algoritmo de Euclides, exponenciación rápida, tamiz de Eratóstenes, número primo de módulo inverso, resolución de ax + by = c y ecuaciones diofantinas similares, cálculo de la función de Euler, transformación rápida de Fourier, algoritmo de Gauss para inversión matricial / sistema de resolución de ecuaciones lineales , teorema chino sobre residuos.
  6. Geometría: intersección de líneas, segmentos, círculos, líneas y polígonos, tangentes y tangentes comunes, puntos móviles, líneas y segmentos, clasificación por ángulo, cálculo de longitudes y áreas, casco convexo, algoritmos de líneas de exploración, puntos rápidos dentro del polígono, búsqueda de dos más cercanos / puntos más lejanos, cubriendo el círculo.
  7. Varios: número de combinaciones, números de catalán, fórmula de inclusión-exclusión, lema de Burnside, números de Stirling, números de Grundy para juegos.

Creo que lo siguiente es importante:

Tipo de fusión, prims v / s kruskal, problemas de retroceso, vendedores ambulantes

Vine por algunos videos en youtube. Eran bastante útiles para tener una comprensión real de los algoritmos. He proporcionado el enlace aquí en caso de que desee consultar:

Recopilé una gran cantidad de materiales para mi preparación de icpc. A continuación se muestra el enlace del material myCODING C ++

CODIFICACIÓN C ++ – Google Drive

El problema con esto es que se supone que debe tener un conocimiento particular para tener éxito. Lamentablemente, gran parte de lo que consideramos enseñanza y aprendizaje trata de hechos, en lugar de poder encontrarlos y utilizarlos.

No es necesario conocer ningún algoritmo específico para ser competitivo. Es posible que pueda decirle cuáles son uno o dos de los que enumeró, probablemente hayan implementado algunos de los otros sin saber sus nombres, pero eso es todo lo que puedo decir sobre ellos. Eso probablemente sea cierto para cualquier otro algoritmo que la gente piense que también debería estar en la lista.

Lo que puedo hacer es encontrar ideas y ejemplos de la red sobre cómo realizar cualquier tarea en la que estoy trabajando. Dado eso, puedo adaptar lo que encuentro a la tarea en cuestión y hacer que funcione. Si luego tengo una tarea similar que hacer más tarde, puedo comenzar desde esa primera adaptación y modificarla para que funcione en mi nuevo entorno. De hecho, si parece una capacidad realmente útil, es probable que la generalice y cree un método de biblioteca que luego pueda volver a aplicar en el futuro.

En mi opinión, es mucho más importante poder encontrar, asimilar e implementar algoritmos según sea necesario, entonces es conocer cualquier algoritmo particular o incluso conjunto de algoritmos. El mejor cumplido que recibí fue mi supervisor diciéndole a otra persona que “Ian parece aprender por un proceso de ósmosis”. Eso es lo que me hace valioso: la capacidad de descubrir lo que hay que hacer, de imaginar cómo debe hacerse, dadas las limitaciones de la tarea, y luego hacerlo.

More Interesting

Matemáticas generales que uno debe saber antes de tomar la clase de algoritmo? Especialmente para estudiantes con antecedentes no informáticos.

¿Cuáles son algunos problemas informáticos para los que no existe un enfoque de fuerza bruta?

¿Debo aprender el concepto profundo del aprendizaje automático como el curso de Andrew Ng o es suficiente para saber qué algoritmo se utiliza cuando?

Cómo encontrar la complejidad de tiempo de caso promedio de un algoritmo

En el algoritmo de búsqueda A * deberíamos tener una lista abierta y otra cerrada. ¿Cómo los implementa utilizando tanto el hashmap como una cola prioritaria en Java?

¿Los programadores realmente implementan los algoritmos, o usan los que se dan en las bibliotecas? (como usar HashMap en Java)

Lenguaje ensamblador: ¿Por qué las instrucciones INC y DEC no establecen la bandera de acarreo?

¿Por qué char array proporciona String cuando se imprime en el método System.out.println ()?

Sistemas distribuidos: ¿Existe un algoritmo de elección de líder para un anillo sincrónico en el que todos los procesadores menos uno tienen la misma ID?

Cómo analizar la complejidad temporal del algoritmo MST de prims

¿Cuáles son las diferencias entre DFS y BFS?

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?

¿Cuáles son las características de un algoritmo codicioso?

Cómo resolver el problema de recolectar manzanas usando programación dinámica

¿Cuál es el significado de usar una cola prioritaria en el algoritmo de Dijkstra? ¿Qué diferencia hay si usamos una cola normal?