Для каждой вычислимой функции существует ли задача, которая может быть решена в лучшем случае за время или существует вычислимая функция такая, что любая задача, которая может быть решена в может также быть решено в время?
Этот вопрос возник в моей голове вчера. Я думал об этом немного сейчас, но не могу понять это. Я действительно не знаю, как я Google для этого, поэтому я спрашиваю здесь. Вот что я придумала:
Сначала я подумал, что ответ «да»: для каждой вычислимой функции проблема «Вывести точек» (или создать строку с точками или чем-либо еще), очевидно, не может быть решена в время. Таким образом, нам нужно только показать, что это может быть решено за время. Нет проблем, просто возьмите следующий псевдокод:
x = f(n)
for i from 1 to x:
output(".")
Понятно, что этот алгоритм решает поставленную задачу. И время его выполнения явно в , поэтому проблема решена. Это было легко, правда? Кроме нет, это не потому, что вы должны учитывать стоимость первой строки. Время выполнения вышеупомянутого алгоритма только в если время, необходимое для вычисления находится в . Очевидно, что это не так для всех функций 1 .
Так что такой подход никуда меня не привел. Я был бы благодарен всем, кто указал мне правильное направление, чтобы понять это должным образом.
1 Рассмотрим, например, функцию . Ясно, что , но нет алгоритма, который вычисляет за времени. O ( p ( n ) ) = O ( 1 ) p O ( 1 )
источник
Ответы:
По теореме Гэпа (используя формулировку отсюда , ищите «пробел»), для любой вычислимой неограниченной функции существует некоторая возрастающая (на самом деле, сколь угодно большая) вычислимая функция 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))
Это отвечает на ваш вопрос тем, что существует такое (на самом деле бесконечное множество): для любой вычислимой функции 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 не обязательно конструируемый во времени - для случая, который конструируем во времени, смотрите ответ @RanG.
В формулировке Википедии (которая требует, чтобы ), тогда 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))
В статье Википедии не отмечается, что увеличивается и на самом деле может быть сколь угодно большим (например, f ( n ) ≥ g ( n ) ). В статье , что и доказывает теорему разрыва делает упоминание и доказать это (см здесь , например).f f(n)≥g(n)
источник
Если является конструируемой по времени функцией , то теорема об иерархии времени говорит, что существуют проблемы, которые требуют времени O ( f ( n ) ) и не могут быть решены за время o ( f ( n )f O(f(n)) . В частности,
DTIME(o(f(n)o(f(n)log(f(n)))
Это учитывает только решение проблем и не учитывает время, необходимое для генерации выходных данных.
источник
Я попытаюсь представить что-то вроде основы в надежде, что она даст более глубокое понимание.
Когда вы добираетесь до чего-то такого фундаментального, везде возникают неожиданные ловушки. Например: что значит «решить» проблему? Часто в компьютерных науках мы рассматриваем только вариант «принятия решения», в котором нам дают ввод, и нам нужно только вывести True или False. Вы концентрируетесь на проблеме «функции».
Если вы рассматриваете нотацию O (f (n)) как попытку отловить, сколько «работы» необходимо для решения проблемы, использование решения вместо функции (где требуется вывод) кажется более подходящим, поскольку вы четко отделяете вычисления от форматирования вывода ,
Я не думаю, что это ответит на ваш вопрос, но вас это может заинтересовать: http://en.wikipedia.org/wiki/Time_hierarchy_theorem
Также будьте осторожны с теоремой ускорения .
источник