Estaba leyendo una pregunta en Stack Overflow preguntando si era NP difícil enumerar todos los ciclos simples en un gráfico que contiene un nodo particular y se me ocurrió que no podía pensar en ninguna clase de complejidad existente que fuera adecuada para hablando de problemas de la forma "enumere todas las soluciones a este problema". La clase NP en cierto sentido consiste en problemas que preguntan si existe al menos una solución, la clase FNP pide producir una solución única y la clase #P pide contar cuántas soluciones hay, pero ninguna de ellas trata con la complejidad de enumerar exhaustivamente todas las soluciones posibles.
¿Existe una clase de complejidad para describir problemas que tienen la forma "dado un predicado computable de tiempo polinómico y una cadena , enumere todos los para los cuales es verdadero sujeto a [inserte algunos restricciones de complejidad apropiadas]? " Entiendo que puede ser complicado precisar las restricciones dado que el número de soluciones puede ser exponencialmente mayor que el tamaño de la entrada , aunque eso no parece insuperable.
fuente
Respuestas:
El concepto que está buscando se llama complejidad de enumeración , que es el estudio de la complejidad computacional de enumerar (enumerar) todas las soluciones a un problema (o los miembros de un lenguaje / conjunto). Los algoritmos de enumeración se pueden modelar como un proceso de dos pasos: un paso de precomputación y una fase de enumeración con retraso . Ambos pasos tienen sus propias complejidades de tiempo y espacio (quizás también entropía). En el espíritu general de complejidad, a menudo hay compensaciones entre estos para tener en cuenta.
El paso de precomputación realiza el trabajo necesario antes de enumerar la primera solución. Esto podría implicar encontrar la solución en sí o inicializar una estructura de datos de gran tamaño que reducirá el retraso general entre cada solución.
El retraso es el costo de recursos asociado con el cálculo necesario entre soluciones arbitrarias enumeradas. En otras palabras, el retraso es una medida del espacio y el tiempo necesarios para producir la solución después de la solución i t h . Se dice que los problemas cuyas soluciones que toman tiempo O ( 1 ) para cada enumeración tienen un retraso constante. Se dice que un requerimiento de tiempo O ( p o l y ( n ) ) tiene retraso polinómico.i+1th ith O(1) O(poly(n))
Para el problema de enumeración que mencionó específicamente en su pregunta, debe buscar en la clase y sus hermanos relacionados en la sección 2.1 de "Enumeración: Algoritmos y Complejidad" de Johannes Schmidt (Vinculado en la parte inferior).ENUMNP
¿Por qué nos preocupa el tiempo de precomputación y el retraso?
El retraso es muy clave para comprender las verdaderas complejidades de los problemas de enumeración. Enumerar los elementos de (hasta el tamaño n ) y { → x : ϕ ( → x ) } donde ϕ ( → x ) es una fórmula booleana (es decir, SAT) ambos toman tiempo exponencial. Sin embargo, enumerando a través de Σ ∗Σ∗ n {x⃗ :ϕ(x⃗ )} ϕ(x⃗ ) Σ∗ solo requiere un retraso constante ya que puede pasar por los elementos en algún orden. Por lo que sabemos, el retraso para enumerar soluciones a una instancia de 3SAT podría ser exponencial. Nuestro trabajo como teóricos de la complejidad es captar por qué el último problema es fundamentalmente más difícil (más complejo) que el anterior. Delay hace un muy buen trabajo al mostrar esta diferencia.
Del mismo modo, también necesitamos saber cuánta precomputación se realiza. Podemos reducir el retraso de cualquier problema de enumeración a tiempo y espacio constantes calculando previamente todas las soluciones y almacenándolas en una lista para enumerarlas más adelante. El desafío es encontrar el mejor equilibrio entre los dos recursos.
El orden en el que enumera los elementos también puede influir en la complejidad. Requerir que los resultados se devuelvan en un orden ordenado específico puede requerir que realicemos un cálculo adicional en ambos pasos. Aunque las situaciones en las que cualquier orden es suficiente (siempre y cuando cada elemento enumerado sea único) ciertamente también se estudian.
Hasta donde yo sé, estas clases no suelen tener etiquetas concisas (similares a y N P ). No podemos esperar hacer esto de manera factible ya que las clases de complejidad de enumeración están haciendo malabarismos con 3 o más recursos (precomputación / tiempo total, espacio, retraso y entropía). Simplemente hay demasiadas combinaciones de límites de recursos para repartir nombres especiales. Esto no hace que estas clases sean menos interesantes y tampoco impide que los investigadores lo intenten de todos modos.P NP
Recursos
Esta encuesta (realmente un intento de formalización) debería ayudarlo a comenzar. También demuestra algunos teoremas básicos de jerarquía.
Enumeración: Algoritmos y Complejidad (Johannes Schmidt, 2009)
https://www.thi.uni-hannover.de/fileadmin/forschung/arbeiten/schmidt-da.pdf
Para obtener una enumeración de los resultados en la complejidad de la enumeración, consulte esta compilación comisariada por Kunihiro Wasa. Como está categorizado por tipo de problema, puede encontrar fácilmente una serie de documentos dedicados a enumerar los ciclos de gráficos. Debería ser simple modificar los algoritmos involucrados para considerar solo los ciclos con un nodo dado.
http://www-ikn.ist.hokudai.ac.jp/~wasa/enumeration_complexity.html
fuente