Para cada função computável existe um problema que pode ser resolvido na melhor das hipóteses em ou existe uma função computável modo que todo problema que pode ser resolvido em possa também pode ser resolvido em tempo?
Esta pergunta surgiu na minha cabeça ontem. Estou pensando nisso há um tempo, mas não consigo descobrir. Eu realmente não sei como eu pesquisaria isso, então estou perguntando aqui. Aqui está o que eu vim com:
Meu primeiro pensamento foi que a resposta é sim: Para cada função computável o problema "Output pontos" (ou criar uma cadeia com pontos ou o que for) não pode, obviamente, ser resolvido em hora. Portanto, precisamos mostrar apenas que ele pode ser resolvido no tempo . Não tem problema, basta usar o seguinte pseudo-código:
x = f(n)
for i from 1 to x:
output(".")
Claramente, esse algoritmo resolve o problema declarado. E o tempo de execução está obviamente em , então o problema foi resolvido. Isso foi fácil, certo? Exceto que não, não é porque você deve considerar o custo da primeira linha. O tempo de execução do algoritmo acima é apenas em se o tempo necessário para calcular estiver em . Claramente isso não é verdade para todas as funções 1 .Θ ( f ( n ) ) f ( n ) O ( f ( n ) )
Portanto, essa abordagem não me levou a lugar algum. Ficaria grato por alguém me apontando na direção certa para descobrir isso corretamente.
1 Considere, por exemplo, a função . Claramente , mas não há algoritmo que calcule no tempo de . O ( p ( n ) ) = O ( 1 ) p O ( 1 )
fonte
Respostas:
Pelo teorema de Gap (usando a formulação daqui , procure por 'gap'), para qualquer função ilimitada computável , existe algum aumento (de fato, arbitrariamente grande) computável função modo que . f : N → N 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))
Isso responde à sua pergunta na medida em que existe um tal (infinitamente muitos, de fato): para toda função computável tal que , existe alguma função crescente tal que todos os problemas solucionáveis em tempo também é solucionável no tempo . Observe que não é necessariamente construtível no tempo - para o caso construtível no tempo, veja a resposta de @RanG.g g = o ( n ) f O ( f ( n ) ) O ( g ( f ( n ) ) = o ( f ( n ) ) ff g g=o(n) f O(f(n)) O(g(f(n))=o(f(n)) f
Na formulação da Wikipedia (que requer que ), então se torna seu exemplo, precisa ser (para que você faça o contrário - 'problemas solucionáveis em também são solucionáveis em 'é a parte interessante).g ∘ f f ω ( n ) O ( g ( f ( n ) ) O ( g ( n ) )g(x)≥x g∘f f ω(n) O(g(f(n)) O(g(n))
O artigo da Wikipedia não observa que está aumentando e pode de fato ser arbitrariamente grande ( por exemplo). O artigo que comprova o teorema do intervalo faz menção e provar isso (ver aqui , por exemplo).f ( n ) ≥ g ( n )f f(n)≥g(n)
fonte
Se é uma função construtiva de tempo , o Teorema da Hierarquia de Tempo diz que existem problemas que requerem tempo e não podem ser resolvidos com tempo . Especificamente, O ( f ( n ) ) o ( f ( n )f O(f(n)) DTIME(o(f(n))o(f(n)log(f(n)))
Isso considera apenas problemas de decisão e não considera o tempo necessário para gerar a saída.
fonte
Vou tentar fornecer uma espécie de estrutura na esperança de que conceda uma visão mais profunda.
Quando você chega a algo tão fundamental, existem armadilhas inesperadas em todos os lugares. Por exemplo: o que é "resolver" um problema? Freqüentemente, na ciência da computação, consideramos apenas a variante "decisão", na qual recebemos uma entrada e precisamos apenas produzir True ou False. Você está se concentrando no problema da "função".
Se você considerar a notação O (f (n)) como tentar capturar quanto "trabalho" é necessário para resolver um problema, usar decisão em vez de função (onde a saída é necessária) parecerá melhor porque você separa claramente o cálculo da formatação da saída .
Acho que isso não vai responder à sua pergunta, mas você pode estar interessado nisso: http://en.wikipedia.org/wiki/Time_hierarchy_theorem
Além disso, tenha cuidado com o teorema da aceleração .
fonte