Para poder explicar el problema P vs NP a los no matemáticos, me gustaría tener un ejemplo pedagógico de cuándo se puede evitar la búsqueda de fuerza bruta. Idealmente, el problema debería ser inmediatamente comprensible y el truco no debería ser ni demasiado fácil ni demasiado difícil.
Lo mejor que he encontrado hasta ahora es
SUBSET_PRODUCT_IS_ZERO
El problema es fácil de entender (dado un conjunto de enteros, ¿se puede formar un subconjunto con el producto 0?), Pero el truco es demasiado fácil (verifique si 0 está entre los números dados, es decir, no es necesario observar muchos subconjuntos).
¿Alguna sugerencia?
Respuestas:
¡Recomiendo a Jenga !
Pero, de hecho, Uri Zwick demostró en 2005 que puedes jugar a Jenga perfectamente haciendo un seguimiento de solo tres enteros, usando un conjunto simple de reglas que puedes colocar fácilmente en una tarjeta de visita. Los tres números que necesitas son
Aquí II significa que debe mover el ladrillo central de cualquier capa superior de 3 capas, II- significa que debe mover un ladrillo lateral de 3 capas a la parte superior, -I- significa que debe mover un ladrillo lateral de una capa de 2 capas arriba, y el bob-omb significa que debes pensar en la muerte y ponerte triste y esas cosas . Si hay más de un movimiento sugerido en un cuadro, puede elegir cualquiera de ellos. Es trivial ejecutar esta estrategia en tiempo si ya conoce el triple , o en tiempo si no lo sabe.O(1) (m,n,t) O(N)
Moraleja: Jenga solo es divertido si todos son torpes y / o borrachos.
fuente
Un cajero tiene que devolver centavos de cambio a un cliente. Dadas las monedas que tiene disponibles, ¿puede hacerlo y cómo?x
Hay dos variantes del problema:
La variante fácil se puede resolver con un algoritmo codicioso. El más difícil requiere programación dinámica.
En realidad, la forma de presentar esto es proponer la solución de fuerza bruta, hacer que la gente entienda que es muy ineficiente y luego preguntarles qué hacen los cajeros, primero por la variante fácil, luego por la difícil. Debería tener algunos ejemplos disponibles que van de fácil a desagradable.
fuente
¡Creo que encontré un ejemplo útil yo mismo!
Quizás era un poco vago, pero estaba buscando un problema que cumpliera con las siguientes especificaciones:
Para el Ciclo Euleriano es fácil explicar que es una condición necesaria que cada nodo debe tener un grado uniforme, pero no es tan fácil explicar por qué es una condición suficiente.
Este es el problema que creo que hasta ahora cumple mejor con la especificación anterior:
FORM_TARGET_SET_WITH_UNIONS
Colección de conjuntosC={S1,S2,...,Sn}
Conjunto de objetivosT
Pregunta: ¿Es posible formar el conjunto de objetivos tomando la unión de algunos de los conjuntos en ?T C
Algoritmo obvio pero ineficaz:
Mejor algoritmo
También está el problema de la hermana.
FORM_TARGET_SET_WITH_INTERSECTIONS
para lo cual el mejor algoritmo es
Como puede ver, estaba buscando algo realmente simple (casi tan simple como SUBSET_PRODUCT_IS_ZERO).
El problema también se puede contrastar con SUBSET SUM y SUBSET PRODUCT, que son NP completos pero similares en su formulación. En todos estos problemas, se le presenta una colección de objetos y se le pregunta si una operación en una selección de estos objetos puede producir el resultado deseado.
fuente