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

Jack Dongarra y Francis Sullivan publicaron una lista de “Los diez mejores algoritmos del siglo. Su lista incluía:

  1. el método Monte Carlo o el algoritmo Metropolis, ideado por John von Neumann, Stanislaw Ulam y Nicholas Metropolis;
  2. el método simplex de programación lineal, desarrollado por George Dantzig;
  3. el método de iteración del subespacio de Krylov, desarrollado por Magnus Hestenes, Eduard Stiefel y Cornelius Lanczos;
  4. la descomposición de la matriz Householder, desarrollada por Alston Householder;
  5. el compilador Fortran, desarrollado por un equipo dirigido por John Backus;
  6. el algoritmo QR para el cálculo del valor propio, desarrollado por J Francis;
  7. el algoritmo Quicksort, desarrollado por Anthony Hoare;
  8. la Transformada rápida de Fourier, desarrollada por James Cooley y John Tukey;
  9. el algoritmo de detección de relación de enteros, desarrollado por Helaman Ferguson y Rodney Forcade; (dados N valores reales XI, ¿hay un conjunto no trivial de coeficientes enteros también esa suma (1 <= I <= N) AI * XI = 0?
  10. el rápido algoritmo multipolar, desarrollado por Leslie Greengar y Vladimir Rokhlin; (para calcular las fuerzas gravitacionales en un problema de cuerpo N normalmente se requieren cálculos N ^ 2. El método rápido multipolo utiliza cálculos de orden N, al aproximar los efectos de grupos de partículas distantes usando expansiones multipolo)

Fuente: Los diez mejores algoritmos del siglo

Para resolver la mayoría de los desafíos, conocer 10 algoritmos no contará mucho. Una lista exhaustiva contendría más de 50 algoritmos.

Las estructuras de datos y algoritmos más utilizados son:

  1. Búsqueda binaria
  2. Ordenación rápida
  3. Ordenar fusión
  4. Matriz de sufijo
  5. Algoritmo de Knuth-Morris-Pratt (KMP)
  6. Algoritmo Rabin-Karp
  7. Intentos
  8. Profundidad primer recorrido de un gráfico
  9. Amplitud Primero transversal de un gráfico
  10. Algoritmo de Dijkstra
  11. Árbol indexado binario
  12. Árbol de segmentos (con propagación perezosa)
  13. Árbol de segmento persistente
  14. Algoritmo Z
  15. Algoritmo de Floyd Warshall
  16. Tabla dispersa (RMQ)
  17. Heap / Priority Queue / Heapsort
  18. Inverso Multiplicativo Modular
  19. nCr% M
  20. Sufijo Automaton
  21. Antepasado común más bajo
  22. Contando inversiones
  23. Algoritmo Extendido de Euclides
  24. Árbol de sufijo
  25. Programación dinámica
  26. Estructuras de datos básicos
  27. Exponenciación logarítmica
  28. Gráficos
  29. Árbol de expansión mínima
  30. Factorización Prime eficiente
  31. Combinatoria
  32. Conjunto de búsqueda / disjunto de unión
  33. Problema de mochila
  34. Algoritmo de coincidencia de cadenas Aho-Corasick
  35. Componentes fuertemente conectados
  36. Algoritmo de Bellman Ford
  37. Descomposición de luz pesada
  38. Casco convexo
  39. Implementación del algoritmo Jarvis
  40. Intersección de línea
  41. Tamiz de Erastothenes
  42. Árbol de intervalo
  43. Contando Ordenar
  44. Las probabilidades
  45. Matriz de exponenciación
  46. Flujo de red
  47. Flujo máximo (Ford-Fulkerson)
  48. Árbol Kd:
  49. Deque
  50. Árbol de búsqueda binaria
  51. Selección rápida
  52. Treap / Árbol cartesiano
  53. Teoría de juego
  54. STL
  55. Máxima coincidencia bipartita
  56. Algoritmo de Manacher
  57. Prueba de primalidad de Miller-Rabin
  58. Problema de matrimonio estable
  59. Algoritmo Húngaro
  60. Algoritmo de línea de barrido
  61. LCP
  62. Eliminación gaussiana
  63. Factorización de Rho Pollard Integer
  64. Clasificación topológica
  65. Detección de ciclos en un gráfico: dirigido, no dirigido
  66. Geometría
  67. Retroceso
  68. Caminos Eulerianos y Hamiltonianos
  69. Coloración gráfica
  70. Encontrarse en el medio
  71. Entero de precisión arbitraria (BigInt)
  72. Radix Sort
  73. Clasificación de cubo
  74. Algoritmo de Johnson
  75. Máxima coincidencia en un gráfico general
  76. Recursividad
  77. Principio de inclusión y exclusión
  78. Compresión coordinada
  79. Descomposición cuadrada
  80. Árbol de corte de enlace
  81. Función totiente de Euler
  82. Lema de Burnside
  83. Editar / Distancia Levenshtein
  84. Branch and Bound
  85. Matemáticas para la programación competitiva
  86. Algoritmo de Mo

Bueno, el recuento se detuvo en 86 ..

Fuente: estructuras de datos y algoritmos

El algoritmo más importante para saber es cómo aprender.

El segundo algoritmo más importante para conocer es cómo buscar en línea.

No hay un conjunto de diez algoritmos “imprescindibles”. Un desafío significativo desafiaría la solución trivial con un algoritmo bien conocido.

Algunas citas de mi comunicación por correo electrónico con algunos de los 10 mejores chicos de Topcoder hace cinco años:

  • Desde mi experiencia, realmente no necesitas saber que muchos avanzados
    algoritmos, ni siquiera en las finales mundiales de ICPC. Se trata mucho más de solo
    darse cuenta de qué algoritmo en su arsenal debe usar en un
    problema específico, detalles de implementación, etc. Y la única forma de obtener
    esa práctica es resolver muchos, muchos problemas, como más de 1000 o más, solo
    para acelerar sus habilidades de codificación, mejore la implementación
    técnica (no debería tener que pensar si es mejor hacer DFS o BFS o
    DP o memorización sobre algún problema donde todos estos métodos podrían ser
    aplicable) y escriba código libre de errores en el primer intento.
  • Lo importante es tener una base en lo básico y poder adaptar esos enfoques a problemas nuevos. Los conceptos básicos incluyen: varias formas de búsqueda de gráficos, flujo máximo, programación dinámica, etc. Por cierto, no tengo idea de cuáles son los algoritmos de Aho-Corasick y Chu-liu / Edmonds que mencionas. 🙂
  • Es posible que desee aprender algo sobre las estructuras de datos, a veces (pero rara vez) se necesita un árbol equilibrado, a veces se puede usar un árbol de rango bidimensional.

También me he asociado con algunos de los tipos fuertes antes, en realidad no podía creer lo simples que parecían sus soluciones. Entonces, creo que se trata más de practicar y resolver problemas que de aprender nuevos algoritmos.

  1. Aprenda a usar un motor de búsqueda web para determinar qué técnica general es útil para el problema en cuestión
  2. Aprenda a escanear los foros de TopCoder / Spoj / Codechef en busca de técnicas similares donde pueda obtener más información sobre el problema en cuestión.
  3. Aprenda a realizar cálculos al final del sobre para determinar el gran Oh aproximado para la solución que tiene en mente.
  4. Comprenda cómo puede aumentar las estructuras de datos estándar que otros han mencionado en este hilo para ayudarlo rápidamente a hacer lo que quiere hacer. Hay un capítulo sobre esto en CLRS, que casi roza la superficie de lo que es posible.
  5. Aprenda sobre la propagación perezosa. Muy útil para soluciones basadas en árboles.
  6. Aprenda a codificar búsquedas exhaustivas (generalmente de forma recursiva), ya que es útil cuando todo lo demás falla.
  7. Algo que la gente (y yo) usualmente extrañamos es tratar de usar la búsqueda binaria (BS) en el espacio de la solución. Por ejemplo, BS podría ser útil no solo para buscar un elemento en una matriz ordenada, sino que si tiene un oráculo Sí / No Y el espacio de búsqueda es capaz de BS, puede adivinar la respuesta e invocar el oráculo O (log n) veces.
  8. La búsqueda ternaria es muy útil. Casi nunca lo uso porque soy demasiado viejo para esto, pero es mi pérdida y tu ganancia.
  9. Pregúntele a otros: ¡este es el algoritmo más fácil!
  10. Brian Bi ha dado una respuesta excelente y mantiene un wiki muy útil en la página principal – PEGWiki. Si lo busca en Google, entonces supongo que ve las páginas en un orden no creciente de su rango de página. Esto podría traducirse en páginas más populares (y, por lo tanto, más buscadas / vinculadas) que aparecen en la parte superior. Comenzaría con todo en las páginas 1 y 2.
  11. No te rindas Consulte el punto n. ° 9.

ps De hecho, Google permite a los propietarios de PEG Judge – Main ver datos de clasificación para ese sitio. Quizás Brian Bi podría echar un vistazo.

EDITAR :

1) Algoritmos gráficos : primera búsqueda de amplitud (BFS), primera búsqueda de profundidad (DFS), componentes fuertemente conectados (SCC), Dijkstra, Floyd-Warshall, árbol de expansión mínima (MST), clasificación topológica.

2) Programación dinámica : problemas de programación dinámica estándar como corte de varillas, mochila, multiplicación de cadena de matriz, etc.

3) Teoría de números : aritmética modular, teorema de Fermat, teorema del resto chino (TRC), método euclidiano para MCD, exponenciación logarítmica, tamiz de Eratóstenes, función totient de Euler.

3) Codicioso : problemas estándar como la selección de actividades.

4) Técnicas de búsqueda : búsqueda binaria, búsqueda ternaria y reunión en el medio.

5) Estructuras de datos (Básico) : pilas, colas, árboles y montones.

6) Estructuras de datos (avanzado) : Trie, árboles de segmento, árbol de Fenwick o árbol indexado binario (BIT), estructuras de datos disjuntas.

7) Cadenas : Knuth Morris Pratt (KMP), algoritmo Z, matrices de sufijos / árboles de sufijos. Estos son algoritmos poco avanzados.

8) Geometría computacional : Graham-Scan para casco convexo, barrido de línea.

9) Teoría del juego : principios básicos del juego de Nim, números de Grundy, teorema de Sprague-Grundy.

La lista no está completa, pero estas son las que encuentras con mucha frecuencia en los concursos. Hay otros algoritmos, pero rara vez se requieren en los concursos.

Fuente: Aprenda a codificar por programación competitiva

Este blog fue escrito por MV Kaushik (finalista mundial de ACM-ICPC 2013. Ahora trabaja en Facebook (empresa)).

Los siguientes son los algoritmos / conceptos que uno debe conocer (especialmente un programador) para resolver acertijos CS:

  • Listas, matrices, pila
  • Árboles: árbol binario, k-ary, AVL, B y B +
  • Ordenar y buscar- esp. QuickSort, RadixSort, búsqueda e indexación binarias
  • Colas de prioridad: montones
  • Coincidencia de patrones y análisis : expresiones regulares
  • Hashing- Funciones de Hash
  • Conjuntos disjuntos
  • Algoritmos de gráficos y estructuras de datos: problemas como el cálculo del árbol de expansión mínimo, la determinación de la ruta más corta entre dos nodos, la coincidencia y la detección de vértices de corte surgirán en varias situaciones. El PageRank de Google, por ejemplo, es una aplicación muy concreta de algoritmos gráficos.
  • Programación dinámica: estrechamente relacionada con los algoritmos de gráficos, la programación dinámica aprovecha el hecho de que la solución óptima para un gran problema puede expresarse como una combinación óptima de subproblemas.
  • Algoritmos de búsqueda de espacio de estado: búsqueda de profundidad limitada, búsqueda de amplitud primero, A *; Inteligencia artificial; Algoritmos genéticos

Comience con estos

  1. Divide y conquistaras,
  2. programación dinámica: es un algoritmo imprescindible, ya que la mayoría de los problemas necesitan su conocimiento (conocimiento completo).
  3. método codicioso,
  4. programación lineal,
  5. El algoritmo de Dijkstra, el algoritmo de Floyd-Warshall y el algoritmo de Kruskal o Prim
  6. Búsqueda binaria y algoritmos de clasificación,
  7. Gráficos, Árboles,
  8. Pila, cola y vectores
  9. Primera búsqueda de amplitud (BFS) / Primera búsqueda de profundidad (DFS).
  10. Matriz de sufijo

Aprenda todo esto de TopCoder, GeeksForGeeks o Tutoriales de estructuras de datos y algoritmos (compilaron maravillosamente todos los algoritmos importantes de TopCoder y GeeksForGeeks)

Nota: tienes que aprender mucho más que estos 10. Pueden ayudarte, pero para ser eficiente, necesitas mucho más que esto.
Nota: las matemáticas también son necesarias, así que conviértete en eficiente también en matemáticas.

Lo más importante: necesita pasión, perseverancia y sed de conocimiento.

Si desea algoritmos específicos, mis 10 principales serían:

  • Dijkstra : según el tipo de concurso, es posible que vea problemas básicos de búsqueda de rutas o problemas con reducciones no obvias de problemas de búsqueda de rutas. Siempre que tenga un problema de minimización de costos con un número finito (razonablemente pequeño), un estado inicial un estado objetivo, puede verlo como un problema de búsqueda de ruta.
  • Bellman-Ford es útil para encontrar caminos cuando los bordes pueden tener costos negativos. Por ejemplo, si está navegando por un laberinto con pociones que aumentan la salud y los peligros que lo reducen, Bellman-Ford sería un gran enfoque.
  • Floyd-Warshall es útil para calcular todos los caminos. A veces se usa en problemas en los que no necesita todas las rutas, porque es muy fácil de implementar. Sin embargo, es más lento que otros algoritmos de búsqueda de ruta, por lo que si Floyd-Warshall es una opción depende del tamaño del gráfico.
  • Edmonds-Karp para problemas de corte de flujo máximo / mínimo. Una aplicación común son los problemas de coincidencia bipartita. Por ejemplo, dadas N personas, M alimentos y una lista de las alergias alimentarias de cada persona, ¿a cuántas personas puede alimentar?
  • El algoritmo húngaro para problemas de asignación. Similar a lo anterior, pero en estos problemas los bordes tienen pesos, y estamos maximizando el peso total en lugar de solo el número de coincidencias.
  • El “algoritmo” de la línea de barrido (más un enfoque general realmente) es útil para varios problemas geométricos, como el problema del par más cercano. También es útil para una variedad de problemas relacionados con la intersección, como encontrar segmentos de línea que se cruzan o eventos de calendario en conflicto.
  • Graham scan u otro algoritmo de casco convexo, para problemas como la construcción de una cerca mínima para encerrar a los animales.
  • Un algoritmo para encontrar componentes fuertemente conectados , como el de Tarjan.
  • Algoritmo de Prim para árboles de expansión mínima.
  • Algoritmo de Knuth-Morris-Pratt para la búsqueda de cadenas.

Otros conceptos que vale la pena estudiar, que no están en la lista anterior porque no son algoritmos específicos:

  • La memorización / programación dinámica es bastante útil. Algunos problemas tienen soluciones DP obvias, mientras que otros tienen soluciones no tan obvias que requieren práctica para reconocerlas.
  • La búsqueda binaria es útil en muchos problemas de optimización, así que asegúrese de estar muy cómodo al implementarla.
  • La teoría del juego combinatorio surge de vez en cuando. Recomiendo la introducción de Thomas Ferguson.
  • Los intentos son útiles en una variedad de problemas relacionados con el texto.

Aquí están algunos:

  • Rango mínimo de consultas
  • Exponenciación rápida
  • Árboles de sufijos y matrices de sufijos
  • Segmentar árboles
  • Doble BFS
  • Divide y conquistaras
  • Barrido de línea
  • Binarias y otras búsquedas N-arias
  • Multiplicación matricial, combinada con exponenciación rápida
  • Juegos de nim

Además de lo que otros han escrito:

1. Como recuerdo, se pasa mucho tiempo de computadora en los algoritmos de clasificación.

2. No olvide la PROGRAMACIÓN LINEAL.

3. En mi trabajo, la PROGRAMACIÓN DINÁMICA ha sido la más útil. Yo (con colegas) lo usé para casi una docena de trabajos de investigación en diversas áreas de aplicación.

4. A menudo, los algoritmos GREEDY se usan para encontrar soluciones subóptimas rápidamente.

La programación dinámica (DP) parece explicar 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 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 de 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, una vez más, 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
  • Algoritmo de Kruskal o de 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)

1. Al evaluar las expresiones matemáticas, esto puede calentarse y le permitirá saber que los problemas no son fáciles de resolver ni muy difíciles de resolver.
La entrada de ejemplo será una expresión matemática como: (A + B * CD * (AC) + A) y A = 2, B = 3, C = 7, D = 8, la salida será el valor de la expresión en el dado punto de entrada
2. DFS y BFS, creo que el gráfico es el modelo más general en informática y resolución de problemas, debe tener un buen algoritmo transversal.
3. La subsecuencia común más larga. Para comprender la programación dinámica, esto también te hará aprender a dividir y conquistar. Como programación dinámica = dividir y conquistar + memorización.
4. A *, encontrar la ruta optimizada en gráficos grandes, encontrar la mejor ruta, la solución optimizada que obtendrá y aprenderá IA, también aprenderá uno de los algoritmos más importantes: el algoritmo de Dijkstra, encontrar la ruta más corta, ya que A * es una extensión de eso.
5. Quicksort usando la mediana de las medianas como pivote, aprenderá una de las mejores técnicas de clasificación, y usando la mediana de las medianas aprenderá la magia de la aproximación. Eche un vistazo al tipo de fusión también. Eche un vistazo al tipo de inserción, aprenderá algoritmos en línea y análisis amortizados.
6. clasificación basada en índices, esto le ayudará a comprender que a veces puede ir más allá del límite inferior utilizando todo lo almacenado en la memoria.
7. Cualquier algoritmo de búsqueda de casco convexo, que lo introducirá a la geometría computacional, que tiene una gran cantidad de estructuras de datos avanzadas.
8. Algoritmo de Prim, solo por pasar más tiempo en gráficos y aprender un enfoque codicioso.
9. Al leer el algoritmo KMP, aprenderá el pensamiento original y las operaciones con cadenas.
10. Haciendo autómatas finitos, PDA, máquina de turing, esto le dará otro nivel de pensamiento al resolver problemas.

Solo hay 16 tipos de problemas de concurso de programación de un análisis realizado por alguien de USACO:

  • Programación dinámica
  • Codicioso
  • Búsqueda completa
  • Llenado de inundación
  • Trayectoria más corta
  • Técnicas de búsqueda recursiva
  • Árbol de expansión mínima
  • Mochila
  • Geometría Computacional
  • Flujo de red
  • Camino Euleriano
  • Casco convexo bidimensional
  • BigNums
  • Búsqueda heurística
  • Búsqueda aproximada
  • Problemas ad hoc

Los problemas más desafiantes son los problemas de combinación que involucran un bucle (combinaciones, subconjuntos, etc.) alrededor de uno de los algoritmos anteriores, o incluso un bucle de un algoritmo con otro dentro de él. Estos parecen extraordinariamente difíciles de corregir, aunque conceptualmente son “obvios”.
(fuente: Olimpiada informática de EE. UU.)

Veo personas que dicen cosas buenas, pero se centran en el algoritmo en sí mismo y está bien y mal al mismo tiempo. Sé que la pregunta es sobre algoritmos, pero probablemente lo que estás buscando es “lo más importante que uno debe saber para resolver la mayoría de los desafíos / acertijos”.

“Las soluciones / algoritmos surgen de la estrategia correcta, no a la inversa”

1) Cuando te enfrentas a un problema real que apenas sabes lo que estás tratando de resolver, lo primero que piensas es acerca de la estrategia.
Las 3 estrategias que DEBE comprender totalmente son:
Codicioso
Programación Dinámica (DP)
Divide y conquistaras

Si comprende el principio de estos, resolverá todo. (PUNTO)

El primero se trata de usar la mejor solución local e iterar para encontrar la solución global. Casi cualquier problema será solucionable con esto, solo necesita “encajar” el problema.

El segundo es como “no tengo idea de lo que estás buscando, usa DP”, DP resolverá cualquier cosa, pero el problema debe ser pequeño, o volarás la memoria.

El último (y mi favorito), si sabe resolver un pequeño problema y puede escribir el gran problema en función de muchos pequeños, ya lo hizo.
Me gusta D&C porque no podría ser el mejor, pero siempre será lo suficientemente rápido y eficiente en caché.

Ahora, si realmente comprende esas estrategias, incluso si no conoce el algoritmo exacto, terminará implementando alguna variación del algoritmo que necesita y eso resolverá su problema. Piensa en eso como una guerra, no tienes una receta de pastel (algoritmo) para ganar, pero si conoces la estrategia y la haces bien, probablemente ganarás.

Por cierto, si quieres practicar y evaluar tus habilidades, prueba el topcoder.

Puedo ver que muchos de ustedes publican listas muy largas de algoritmos muy interesantes. ¿Pero no se trata solo de unos pocos algoritmos clave?
O incluso no algoritmos, más bien cosas que debes saber (estoy totalmente de acuerdo con Caio Souza aquí).
Aquí está mi lista de los cinco mejores:

  1. Complejidad del tiempo: sin saberlo, ¿cómo puede ver el beneficio de usar un mejor algoritmo,
    ver, por ejemplo, https://codility.com/programmers
    ¿O tal vez es tan obvio y debería ser el ítem 0?
  2. El principio de “divide y vencerás”: base de muchos algoritmos y un principio de resolución algorítmica de problemas muy conveniente. Aquí se pueden incluir algunas aplicaciones manuales de este principio, como la búsqueda binaria (ver, por ejemplo, https://codility.com/programmers …).
  3. La trinidad de: backtracking, programación dinámica y codiciosa: te ayudarán a resolver la mayoría de los problemas hasta el nivel medio-alto.
    (Ver, por ejemplo, https://codility.com/programmers … y
    https://codility.com/programmers …)
  4. Análisis de costos amortizados: si desea avanzar más, lo necesitará en varios algoritmos ad-hoc complicados, algunos algoritmos estándar inteligentes o para mejorar aún más su programación dinámica.
  5. Una caja de herramientas de algoritmos gráficos, que incluye búsquedas y flujos.

Emparejamiento bipartito
Divide y conquistaras
Programación dinámica
Transformadas rápidas de Fourier
Algoritmos codiciosos
Muchísimo
Codificación Huffman
Inducción
Mochila
Pareo
Corte máximo
Flujo máximo
Hallazgo mediano
Corte mínimo
Árbol de expansión mínimo
Algoritmos aleatorizados
Recurrencias
Programación
Caminos más cortos
Clasificación
Algoritmo de Strassen
Unión encontrar

a través de algoritmos de enseñanza: los conceptos

Los algoritmos utilizados para resolver el problema de satisfacción de restricciones (CSP) son buenos para conocer. Algunos de los problemas CSP más conocidos son el problema de las N-reinas, los problemas de programación complejos, la coloración de mapas y problemas como Zebra Puzzle. BacktrackingSearch (que es un tipo de DFS con asignación de variable única) es el algoritmo básico para resolver CSP. Algunas otras técnicas para resolver CSP son la propagación de restricciones y la búsqueda local.

1 – Programación dinámica : la mayoría de los SRM del codificador superior consisten en al menos un problema DP. Es difícil de pensar y fácil de implementar.

2 – Arreglos de sufijos: puede leer acerca de los arreglos de sufijos aquí Suffix Array | Set 1 (Introducción) – GeeksforGeeks

3 – Primera búsqueda en profundidad: se utiliza para realizar una búsqueda en un árbol o en un gráfico.

4 – Aprende a usar Stack, Queue y Vector

5 – Algoritmo de Dijkstra: se utiliza para encontrar los costos de las rutas más cortas desde un único vértice a un único vértice de destino deteniendo el algoritmo una vez que se ha determinado la ruta más corta al vértice de destino. Debe usarse solo para pesos de borde + ve.

6 – Floyd – Warshall: se utiliza para encontrar caminos más cortos en un gráfico ponderado con pesos de borde positivo o negativo.

7 – Algoritmo MinMax: Minimax

8 – Árboles de segmentos: Tutoriales de algoritmos

9 – Búsqueda binaria: es imprescindible conocer este algoritmo. Se utiliza para buscar un elemento en una matriz / árbol ordenado en el tiempo log (n).

10 – Divide y conquista: algoritmos de división y conquista

Asegúrese de saber Ordenar en n * log (n). Sea bueno en matemáticas Math

Encontré este artículo y creo que es una lectura obligada para todos los programadores de Kaushik MV: ¿Cómo aprendo a codificar?

Los 10 mejores son –

  1. Programación dinámica
  2. Divide y conquistaras
  3. Pila y cola
  4. Floyd o el algoritmo de Warshall
  5. El algoritmo de Kruskal o Prim
  6. Algoritmo de Dijkstra
  7. Mín., Máx., BFS-DFS
  8. Búsqueda binaria
  9. Técnicas de clasificación
  10. Algoritmo codicioso

Puede leerlos y comprenderlos completa y completamente a partir de Tutoriales de estructuras de datos y algoritmos.

Encontré esta página que resultó ser muy beneficiosa para mí.
Te deseo suerte.