Este es mi enfoque personal para determinar si un problema (es decir, un lenguaje ) es NP-completo o no. Si se verifican ambas condiciones:L
- Siento que probar si una instancia en la que en L implica que necesito verificar todas las combinaciones de algún tipoyoL
- y que no hay forma de dividir esa combinación en dos más pequeñas
L
SSS1S2S1S2
ACBABBC
Francamente, este enfoque es muy básico: trato de encontrar un algoritmo (polinómico) para el problema dado. Si no puedo encontrar uno, el problema se vuelve "difícil" en mi punto de vista. Luego viene todo el razonamiento de NP-completeness: ¿podré codificar un problema NP-complete existente en este? (Y dado que esto suele ser mucho más difícil, intento una vez más encontrar un algoritmo polinomial ...)
Sospecho que esta es la forma habitual de pensar. Sin embargo, sigue siendo bastante difícil de aplicar en problemas desconocidos. Personalmente recuerdo que me sorprendió uno de los primeros ejemplos de integridad de NP que me dijeron: el problema de la camarilla . ¡Parecía tan simple de verificar! Así que supongo que esa experiencia tiene mucho que ver con eso. También la intuición puede ser inútil a veces. Recuerdo que me dijeron varias veces dos problemas casi idénticos, pero uno estaba en P y el otro con una pequeña variación era NP completo.
Todavía tengo que encontrar un buen ejemplo (necesito ayuda aquí), pero esto es como el problema de la correspondencia posterior : este es un problema indecidible pero algunas variantes son decidibles.