Me topé con problemas complicados al calcular la complejidad temporal del algoritmo generador de permutaciones, y tuve grandes dificultades para convencer a un amigo (con experiencia en CS teórica) de la validez de mi razonamiento. Me gustaría aclarar esto aquí.
Cuestión de complejidad difícil Dado un número entero positivo $n$ ¿cuál es la complejidad temporal de generar todas las permutaciones en el conjunto $[n]=\{1,2,..,n\}$ ?
Razonamiento del amigo Cualquier algoritmo para generar todas las permutaciones de $[n]$ toma $\Omega(n!)$ tiempo. Este es un límite inferior super-exponencial demostrable, [editado ]por lo que el problema está en EXPTIME.
Mi razonamiento El razonamiento anterior es correcto, salvo que hay que calcular la complejidad con respecto a el número de bits de salida previstos . En este caso, esperamos $n!$ números en la salida, y cada uno puede ser codificado en $\log n$ bits; por lo tanto, esperamos que $b=O(n!\log n)$ bits de salida. Un algoritmo estándar para recorrer todos los $n!$ permutaciones tendrá una sobrecarga de tiempo polinómica, es decir, se ejecutará en $s(n)=O(n!n^k)$ tiempo, por lo que necesitaremos $t(n)=b(n)+s(n) = O(n!(\log n + n^k)) $ tiempo en total.
Desde $b(n)$ es el número de bits de salida, expresaremos $t(n)$ en función de $b(n)$ . Para ello, tenga en cuenta que $n^k \approx (n!)^{k/n}$ utilizando $n! \approx n^n$ Así que $s(n)=O( b(n) (b(n))^{k/n}) = O(b^2(n) )$ . Por lo tanto, tenemos un algoritmo de tiempo polinómico en el número de bits de salida, y el problema debería estar en $P$ no en, digamos, EXPTIME.
Pregunta principal : ¿El razonamiento de quién es correcto, si es que lo es?
Nota Planteé este problema aquí porque tuve una mala experiencia en StackOverflow con un problema diferente de complejidad temporal difícil; y esto ciertamente no es adecuado para Cstheory.SE ya que no es de nivel de investigación.
2 votos
¿Por qué comparar el tiempo con el número de bits de salida?
4 votos
"Este es un límite inferior demostrable y super-exponencial, por lo tanto el problema es NP-duro". Esto es lo que hace NP-duro no significa (es decir, ni NP ni NP-duro significa no polinómico). :-)
0 votos
Que un problema esté en E implica que también es NP-Duro. NP-Duro no implica que no sea polinómico, pero que no sea polinómico sí implica que sea NP-Duro, que es lo que ha dicho. Es una forma tonta de decirlo y creo que es una buena edición, pero no estaba técnicamente mal.
1 votos
@Keith me temo que lo has entendido todo mal. Que un problema esté en E no implica que sea NP-duro. Por ejemplo $P \subseteq E$ pero se cree que ningún problema en P es difícil NP. La no polinomialidad tampoco implica la dureza NP. La no polinomialidad significa simplemente que el problema no está en P. Hay ciertamente lenguajes intermedios NP, que no están en P ni son NP-completos (por supuesto, asumiendo que P $\neq$ NP).
1 votos
Lo siento, no lo he dicho claramente. Donde dije "Que un problema esté en E", realmente quise decir "Que esté estrictamente en E", es decir, que esté en E y no esté en ninguna clase de complejidad que sea subconjunto estricto de E.