¿Cuáles son los 10 algoritmos y estructuras de datos imprescindibles para un concurso de programación?

Como estamos hablando de una lista de los 10 principales, me imagino que te refieres al nivel más introductorio. Aquí hay algunos buenos. Esta lista obviamente no está completa; Estos son solo algunos de los algoritmos más comunes encontrados, sin ningún orden en particular.

1. Búsqueda binaria: para cualquier situación en la que no sabe cuál es la respuesta, pero puede adivinar una respuesta y luego determinar si era demasiado baja o demasiado alta.

2. Búsqueda de amplitud primero (BFS): se utiliza para encontrar rutas más cortas en un gráfico no ponderado. También se puede usar para problemas de conteo de componentes conectados o conectividad de gráficos, aunque para estos problemas DFS también es una opción. Es más fácil de implementar que DFS si no implementa DFS de forma recursiva (lo que a veces no desea hacer por temor a exceder el límite de memoria de la pila).

3. Búsqueda de profundidad primero (DFS): se puede utilizar para encontrar un ciclo en un gráfico, para hacer una clasificación topológica o para encontrar puentes / puntos de articulación, entre otras cosas.

4. Algoritmo de Dijkstra: encuentra la ruta más corta entre dos vértices en un gráfico ponderado. Muchos problemas tienen pesos (distancias, costos) en el gráfico y, por lo tanto, no se pueden resolver solo con BFS.

5. Caminar con puntero: idea general de tener dos punteros en una matriz y moverlos en tándem.

Ejemplo: dado un conjunto de enteros positivos, encuentre el subconjunto más grande donde el máximo es menos del doble del mínimo. Te darás cuenta de que esto es lo mismo que ordenar la entrada y luego pedir el subconjunto más grande donde se cumple la condición. ¿Cómo encontrarlo con eficacia? Cree dos punteros en la matriz que represente los límites inferior y superior. Cada vez que mueva el puntero del límite inferior, avance el puntero del límite superior desde su posición anterior tanto como pueda sin violar los criterios. Dado que ambos punteros solo avanzan, hay como máximo 2N avances de puntero (donde N es el tamaño de la matriz) y el algoritmo solo requiere tiempo O (n) además del costo de la clasificación.

6. Recorridos de árboles: muchos problemas básicos sobre los árboles se reducen a atravesar el árbol en un orden adecuado y devolver los resultados de los cálculos de los subárboles a los árboles primarios a medida que avanza. Ejemplo súper simple: suma los campos de valor en todos los nodos en un árbol de búsqueda binario.

7. Recursión y retroceso: esta es una técnica general, no un algoritmo. Cuando su algoritmo necesite tomar una decisión, tome una decisión arbitraria, y cuando no pueda llegar a una solución, retroceda en sus elecciones hechas anteriormente y pruebe otras diferentes.

8. Recursión con la memorización (programación dinámica de arriba hacia abajo): nuevamente no es un algoritmo, sino más bien una técnica general. Cuando escribe una fórmula recursiva como en el punto 7 anterior, pero en el transcurso de la recursividad, se resuelven casos idénticos varias veces, puede almacenar en caché las respuestas a los casos calculados previamente para evitar volver a calcularlos. Puede almacenar respuestas a casos calculados previamente con cualquier tipo de estructura de mapa (por ejemplo, tabla hash, BST equilibrado).

9. Programación dinámica ascendente: tampoco un algoritmo sino una técnica. A veces, resolver casos en un orden en particular le permite evitar la recursión por completo, porque el resultado de cada llamada recursiva que haría ya se ha memorizado para el momento en que lo haría, por lo que puede acceder al resultado que necesita desde una matriz o mapa. Esta técnica a veces conduce a un código más simple y factores constantes más bajos que si hubiera usado el método en 8.

10. Árboles de segmentos: esta es una estructura de datos que se utiliza en una amplia variedad de problemas. En general, se usa para responder preguntas como “Dada una matriz A y un conjunto de consultas, cada una de las cuales consta de dos índices i y j en A, cuál es el valor, para cada consulta, de la propiedad X para A [i … j]? ” Un ejemplo de la propiedad X sería la suma de la submatriz o el mínimo de la submatriz. Un árbol de segmentos puede resolver problemas como este de manera eficiente incluso en presencia de actualizaciones en la matriz subyacente.

Para una programación competitiva, es una buena idea diversificar su conjunto de herramientas, cubriendo un espectro lo más amplio posible: gráficos, matemática discreta, geometría, etc. Con eso en mente, aquí hay una buena mezcla de trucos:

  1. búsqueda binaria (a menudo reduce los problemas de optimización a problemas de decisión)
  2. union-find
  3. exponenciación por cuadratura
  4. trie
  5. tabla de área sumada
  6. representaciones gráficas (matriz de adyacencia y lista de adyacencia)
  7. caminos más cortos (Dijkstra y Floyd – Warshall)
  8. árbol de expansión mínimo (Kruskal y Prim)
  9. matriz de sufijos
  10. Escaneo de Graham (algoritmo de casco convexo)
  1. Aritmética modular y recuento
  2. Primes y Factorización
  3. DFS / BFS
  4. Algoritmos de ruta más cortos (por ejemplo, Floyd, Dijsktra, Bellman)
  5. Seguimiento de espalda
  6. Programación dinámica
  7. Búsqueda binaria
  8. Trie
  9. Union-Find
  10. Caja negra que usa para STL / Colecciones + comprende las complejidades
  1. diccionario (Python) / hash (Ruby) / std :: map (C ++) / tabla hash
  2. matriz dinámica / lista / std :: vector / lista-vinculada
  3. árboles, transversal primero en profundidad y primero
  4. análisis y tokenización
  5. ordenación (función de biblioteca + ordenar fusión)
  6. instrumentos de cuerda
  7. generación de permutación y generación combinada
  8. recursividad: inducción + caso base
  9. programación dinámica Algoritmo de programación dinámica, Editar distancia
  10. Algoritmos de optimización convexos, discretos u otros, como el ascenso / avaricia
  1. Árbol de decisión
  2. Bosque al azar
  3. Regresión logística
  4. Máquinas de vectores soporte
  5. Bayes ingenuos
  6. k-NearestNeighbor
  7. k-significa
  8. Adaboost
  9. Red neuronal
  10. Markov

Para obtener más información, puede consultar 10 Algoritmos de aprendizaje automático que debe conocer en 2018.

More Interesting

¿Cómo funciona el algoritmo de Youtube en términos de tendencias de un video?

¿Qué número de puntos cruzados será el mejor para mi algoritmo genético?

¿Por qué es necesario un relleno de palabra no utilizado al comienzo del espacio de almacenamiento dinámico asignado?

¿Cuál es una explicación intuitiva del algoritmo de optimización de aprendizaje profundo de Adam?

¿Son los algoritmos iguales para todos los lenguajes de programación?

¿Se aplican las estructuras de datos y algoritmos para C / C ++ a JavaScript?

¿Habrá diferentes algoritmos para implementar la inserción y eliminación de una estructura de datos como b árboles?

¿Las ventajas del arreglo lineal desaparecen si el arreglo es demasiado corto? ¿Por qué veo 4-6 cajas de cajas?

¿Qué algoritmos gráficos (10-15, tal vez) sugeriría que hicieran bien en la programación competitiva?

¿Cómo obtuvieron sus nombres los recorridos de árbol binario preorden, inorder y postorder?

¿Qué compañías necesitan algoritmos de flujo óptico fuertes?

¿Cómo se implementa std :: make_heap de STL?

¿Avanzar en CS en general hará que los algoritmos sean cada vez más complejos con el tiempo que las personas no pueden manejar? ¿Cuáles son las soluciones para ese caso?

¿Desde dónde puedo aprender algoritmos practicando problemas?

Si una computadora toma el control total del control del tráfico aéreo, ¿cómo será el algoritmo? ¿Cómo manejará los aterrizajes de emergencia y cómo manejará una pista paralela?