Estoy tratando de construir una lista de algoritmos / problemas que son "excepcionalmente útiles", como resolver problemas que 'parecen' muy exponenciales en la naturaleza, pero que tienen un algoritmo particularmente inteligente que finalmente los resuelve. Ejemplos de lo que quiero decir:
- Programación lineal (El algoritmo simplex es tiempo exponencial; ¡llevó mucho tiempo encontrar una solución de tiempo polinomial!)
- Más en general, la programación semidefinida
- Prueba de primalidad
- 2-SAT y HORNSAT
- Calcular determinantes (si esto no suena difícil, considere el permanente)
- Encontrar combinaciones perfectas
- Una variedad de problemas teóricos de grupos difíciles que se pueden lograr utilizando la Clasificación de grupos simples finitos
- Una variedad de problemas de gráficos duros que se pueden lograr usando caracterizaciones menores prohibidas (incrustación en una superficie arbitraria; delimitación del ancho de árbol y ancho de rama; gráficos reducibles Delta-Wye)
- Calcular exponenciales en un grupo acotado (es decir, calcular en pasos, como se logra mediante la cuadratura repetida)
- Cálculos basados en el algoritmo LLL. (Como un caso especial: algoritmo euclidiano. Como un caso más general: algoritmos PSLQ o HJLS).
- Problemas de restricción sin términos de Taylor (?). Admito que no entiendo completamente esto, pero parece que probablemente subsume los casos 2-SAT / HORNSAT anteriores y cualquier álgebra lineal sobre campos finitos. Ver aquí para una publicación más larga
- Problemas computables a través de reducciones holográficas .
Como mención honorífica, también mencionaría el isomorfismo gráfico, porque todavía es muy fácil ( ), y es equivalente a muchos otros problemas de isomorfismo:
- Dígrafos / multigrafos / hipergrafías (una especie de problema 'más difícil')
- Autómatas finitos / CFG
Obviamente, hay una variedad de dificultades en estos, pero todos dejan al menos a algunas personas con un cierto sentido de "sorpresa" en el sentido de que el problema puede sonar difícil pero resultar tratable. El LP puede parecer relativamente sencillo, pero a las personas les llevó bastante tiempo construir una solución real. La cuadratura repetida o la resolución de 2-SAT es algo que un estudiante universitario podría inventar por sí mismo, pero si solo hubiera aprendido sobre los problemas NP-Complete sin haber visto HORNSAT, podría sonar como un candidato natural para NP-Completeness. Resolver el CFSG o tener una forma polinómica para verificar la reducibilidad de Delta-Wye no es tarea fácil.
Espero que esto tenga sentido; obviamente hay muchos atributos subjetivos aquí, pero tengo curiosidad por escuchar lo que otras personas encuentran como soluciones eficientes para problemas "obviamente difíciles".
fuente
Respuestas:
Para mí, uno de los algoritmos más eficientes es el algoritmo Blossom V que encuentra la coincidencia perfecta de peso máximo en un gráfico general:
https://en.m.wikipedia.org/wiki/Blossom_algorithm
fuente
Para mí, todos los algoritmos clásicos y más recientes y más eficientes para verificar o encontrar un árbol de expansión mínimo (MST) de un gráfico ponderado de borde conectado son buenos candidatos. Muchos de estos algoritmos se enumeran en wikipedia .
A primera vista, este problema se parece al problema del vendedor ambulante, uno de los pocos problemas NP-hard más famosos. ¡Lo más sorprendente es que existen algoritmos lineales para verificar un MST y muchos algoritmos casi lineales para encontrar un MST! De hecho, uno de los problemas abiertos más famosos en algoritmos es si existe un algoritmo lineal determinista para encontrar un MST en gráficos generales. Resulta que hay estructuras y propiedades matemáticas y gráficas ricas, así como una multitud de aplicaciones prácticas asociadas con MST, lo que lo convierte en uno de los temas más divertidos y ampliables en el curso de informática. Para una introducción exhaustiva un poco desactualizada pero muy bien escrita, consulte el tutorial de Jason Eisner .
fuente