Para cada función computable existe un problema que puede resolverse en el mejor de los casos en el tiempo o existe una función computable tal manera que cada problema que pueda resolverse en también ser resuelto en tiempo?
Esta pregunta me vino a la cabeza ayer. Lo he estado pensando un poco ahora, pero no puedo entenderlo. Realmente no sé cómo buscaría esto en Google, así que pregunto aquí. Esto es lo que se me ocurrió:
Mi primer pensamiento fue que la respuesta es sí: para cada función computable el problema "Salida puntos" (o crear una cadena con puntos o lo que sea) obviamente no se puede resolver en tiempo. Por lo tanto, solo tenemos que demostrar que se puede resolver en el tiempo . No hay problema, solo tome el siguiente pseudocódigo:
x = f(n)
for i from 1 to x:
output(".")
Claramente ese algoritmo resuelve el problema declarado. Y su tiempo de ejecución obviamente está en , por lo que el problema está resuelto. Eso fue fácil, ¿verdad? Excepto no, no es porque tenga que considerar el costo de la primera línea. El tiempo de ejecución del algoritmo anterior solo está en si el tiempo necesario para calcular está en . Claramente, eso no es cierto para todas las funciones 1 .
Entonces este enfoque no me llevó a ninguna parte. Le agradecería a cualquiera que me señale en la dirección correcta para resolver esto correctamente.
1 Considere, por ejemplo, la función . Claramente , pero no existe un algoritmo que calcule en el tiempo .
fuente
Respuestas:
Según el teorema de Gap (usando la formulación de aquí , busque 'gap'), para cualquier función ilimitada computable , existe alguna función computable creciente (de hecho, arbitrariamente grande) f : N → N tal que D T I M E ( f ( n ) ) = D T I M E ( g ( f ( n ) ) .g:N→N f:N→N DTIME(f(n))=DTIME(g(f(n))
Esto responde a su pregunta en el sentido de que existe tal (infinitamente, de hecho): para cada función computable g tal que g = o ( n ) , existe una función creciente f tal que todos los problemas se pueden resolver en O ( f ( n ) ) el tiempo también se puede resolver en O ( g ( f ( n ) ) = o ( f ( n ) ) tiempo. Tenga en cuenta que ff g g=o(n) f O(f(n)) O(g(f(n))=o(f(n)) f no es necesariamente construible en el tiempo; para el caso construible en el tiempo, vea la respuesta de @RanG.
En la formulación de Wikipedia (que requiere que ), entonces g ∘ f se convierta en su ejemplo, y f necesita ser ω ( n ) (para que vaya al revés - 'problemas solucionables en O ( g ( f ( n ) ) también se pueden resolver en O ( g ( n ) ) 'es la parte interesante).g(x)≥x g∘f f ω(n) O(g(f(n)) O(g(n))
El artículo de Wikipedia no señala que está aumentando y, de hecho, puede ser arbitrariamente grande ( por ejemplo, f ( n ) ≥ g ( n ) ). El artículo que demuestra el teorema brecha hace mención y probar esto (ver aquí , por ejemplo).f f(n)≥g(n)
fuente
Esto solo considera problemas de decisión y no considera el tiempo que lleva generar el resultado.
fuente
Trataré de proporcionar una especie de marco con la esperanza de que otorgue una visión más profunda.
Cuando llegas a algo tan fundamental, hay escollos inesperados en todas partes. Por ejemplo: ¿qué es "resolver" un problema? A menudo, en informática consideramos solo la variante de "decisión", en la cual se nos da una entrada y solo necesitamos dar salida Verdadero o Falso. Te estás enfocando en el problema de la "función".
Si considera que la notación O (f (n)) trata de capturar cuánto "trabajo" se necesita para resolver un problema, usar la decisión en lugar de la función (donde se requiere la salida) parece mejor porque separa limpiamente el cálculo del formato de salida .
No creo que esto responda a su pregunta, pero puede estar interesado en esto: http://en.wikipedia.org/wiki/Time_hierarchy_theorem
Además, tenga cuidado con el teorema de aceleración .
fuente