Recientemente, cuando hablé con un físico, afirmé que, en mi experiencia, cuando un problema que ingenuamente parece que debería llevar un tiempo exponencial resulta no trivial en P o BPP, generalmente se puede identificar una "razón general" por la que ocurre la reducción. --- y casi siempre, esa razón pertenece a una lista de una docena o menos de "sospechosos habituales" (por ejemplo: programación dinámica, álgebra lineal ...). Sin embargo, eso me hizo pensar: ¿podemos realmente escribir una lista decente de tales razones? Aquí hay un primer intento incompleto de uno:
(0) Caracterización matemática. El problema tiene una caracterización "puramente matemática" no obvia que, una vez conocida, hace que sea inmediato que puede hacer una búsqueda exhaustiva en una lista de posibilidades de poli (n). Ejemplo: planaridad gráfica, para la cual se sigue un algoritmo O (n 6 ) del teorema de Kuratowski.
(Como "planar" señala a continuación, este fue un mal ejemplo: incluso una vez que conoces una caracterización combinatoria de la planaridad, dar un algoritmo de tiempo polinómico aún no es trivial. Entonces, permíteme sustituir un mejor ejemplo aquí: ¿qué tal? , digamos, "dada una entrada n escrita en binario, calcule cuántos colores se necesitan para colorear un mapa arbitrario incrustado en una superficie con n agujeros". No es obvio a priori que esto sea computable (¡o incluso finito!). Pero hay una fórmula conocida que da la respuesta, y una vez que se conoce la fórmula, es trivial calcularla en tiempo polinómico. Mientras tanto, "la reducción a menores excluidos / teoría de Robertson-Seymour" probablemente debería agregarse como una razón general por la cual algo puede ser En p.)
De todos modos, este no es el tipo de situación que más me interesa.
(1) Programación dinámica. El problema se puede dividir de una manera que permita una solución recursiva sin una explosión exponencial, a menudo porque las restricciones que deben cumplirse están organizadas en un orden lineal u otro simple. "Puramente combinatorio"; No se necesita estructura algebraica. Podría decirse que la accesibilidad gráfica (y, por lo tanto, 2SAT) son casos especiales.
(2) Matroides. El problema tiene una estructura matroide, lo que permite que funcione un algoritmo codicioso. Ejemplos: coincidencia, árbol de expansión mínimo.
(3) Álgebra lineal. El problema puede reducirse a resolver un sistema lineal, calcular un determinante, calcular valores propios, etc. Podría decirse que la mayoría de los problemas que involucran "cancelaciones milagrosas", incluidos los que pueden resolverse mediante el formalismo de la puerta de enlace de Valiant, también caen bajo el paraguas lineal-algebraico.
(4) Convexidad. El problema puede expresarse como algún tipo de optimización convexa. La programación semidefinida, la programación lineal y los juegos de suma cero son casos especiales comunes (cada vez más).
(5) Prueba de identidad polinómica. El problema puede reducirse a verificar una identidad polinómica, de modo que el Teorema fundamental del álgebra conduzca a un algoritmo aleatorio eficiente, y en algunos casos, como la primalidad, incluso un algoritmo determinista demostrable.
(6) Markov Chain Monte Carlo. El problema puede reducirse al muestreo del resultado de una caminata de mezcla rápida. (Ejemplo: aproximadamente contando combinaciones perfectas).
(7) Algoritmo euclidiano. MCD, fracciones continuas ...
Varios / No es obvio exactamente cómo clasificar: matrimonio estable, factorización polinómica, problema de membresía para grupos de permutación, varios otros problemas en teoría de números y teoría de grupos, problemas de celosía de baja dimensión ...
Mi pregunta es: ¿cuáles son las cosas más importantes que he dejado de lado?
Para aclarar:
Me doy cuenta de que ninguna lista puede estar completa: cualquiera que sea el número finito de razones que des, alguien podrá encontrar un problema exótico que está en P pero no por ninguna de esas razones. En parte por esa razón, estoy más interesado en ideas que ponen muchos problemas diferentes, aparentemente no relacionados en P o BPP, que en ideas que solo funcionan para un problema.
También me doy cuenta de que es subjetivo cómo dividir las cosas. Por ejemplo, ¿deberían los matroides ser solo un caso especial de programación dinámica? ¿Es la solvencia por búsqueda profunda primero lo suficientemente importante como para ser su propia razón, separada de la programación dinámica? Además, a menudo el mismo problema puede estar en P por múltiples razones, dependiendo de cómo lo mire: por ejemplo, encontrar un valor propio principal está en P debido al álgebra lineal, pero también porque es un problema de optimización convexo.
En resumen, no espero un "teorema de clasificación", solo una lista que refleje útilmente lo que sabemos actualmente sobre algoritmos eficientes. Y es por eso que lo que más me interesa son las técnicas para poner cosas en P o BPP que tienen una amplia aplicabilidad pero que no encajan en la lista anterior, u otras ideas para mejorar mi primer intento burdo de cumplir mi jactancia con el físico.