Чи існує для кожної обчислюваної функції


19

Для кожної обчислюваної функції чи існує проблема, яку можна вирішити в кращому випадку за час чи є обчислювальна функція така, що кожна проблема, яку можна вирішити в може також вирішуються в час?fΘ(f(n))fO(f(n))o(f(n))

Це питання спливе в голову вчора. Я трохи про це думав зараз, але не можу це зрозуміти. Я насправді не знаю, як би я google для цього, тому я прошу тут. Ось що я придумав:

Моя перша думка полягала в тому, що відповідь - так: для кожної обчислюваної функції проблема "Виведення крапок" (або створення рядка з крапок чи будь-чого іншого) очевидно не може бути вирішена в час. Тож нам потрібно лише показати, що це можна вирішити за час. Немає проблем, просто візьміть наступний псевдо-код:ff(n)f(n)o(f(n))O(f(n))

x = f(n)
for i from 1 to x:
    output(".")

Очевидно, що алгоритм вирішує заявлену проблему. І час виконання, очевидно, у Θ(f(n)) , тому проблема вирішена. Це було легко, правда? За винятком ні, це не тому, що вам доведеться враховувати вартість першого рядка. Вищенаведений алгоритм виконує лише у Θ(f(n)) якщо час, необхідний для обчислення знаходиться в . Зрозуміло, що це не так для всіх функцій 1 .f(n)O(f(n))

Тож такий підхід мене ніде не змусив. Буду вдячний за те, щоб хтось вказував мене в правильному напрямку, щоб це правильно зрозуміти.


1 Розглянемо для прикладу функцію . Зрозуміло, що , але немає алгоритму, який обчислює за час. O ( p ( n ) ) = O ( 1 ) p O ( 1 )p(n)={1if n is prime2otherwiseO(p(n))=O(1)pO(1)


1
Я не думаю, що ваші два твердження у ваших перших абзацах обов'язково є протилежними один одному: що робити, якщо у вас є f така, що існує якась проблема, яку можна вирішити в O(f(n)) , а не в o(f(n)) , ні в Θ(f(n)) час?
Олексій десять Брінк

@Alex Це хороший момент, я не вважав це.
sepp2k

Відповіді:


13

За теоремою про розрив (використовуючи формулювання звідси , шукайте "пробіл"), для будь-якої обчислюваної необмеженої функції g:NN існує деяка зростаюча (насправді довільно велика) обчислювана функція f:NN така, що DTIME(f(n))=DTIME(g(f(n)) .

Це дає відповідь на ваше запитання тим, що існує таке f (насправді безліч): для кожної обчислюваної функції g такої, що g=o(n) , існує деяка зростаюча функція f така, що всі задачі, що вирішуються в O(f(n)) час також можна розв'язати в O(g(f(n))=o(f(n)) часу. Зауважимо , що f не обов’язково конструювати за часом - про випадок, який можна сконструювати за часом, див. відповідь від @RanG.

У формулюванні Вікіпедії (що вимагає, щоб g(x)x ), то gf стає вашим прикладом, а f має бути ω(n) (так що ви йдете навпаки - «задачі, розв’язувані в O(g(f(n)) також розв’язуються в O(g(n)) '- цікава частина).

Стаття у Вікіпедії не відзначити , що зростає , і насправді може бути як завгодно великим ( е ( п ) г ( п ) , наприклад). У статті , що і доводить теорему розриву робить згадка і довести це (див тут , наприклад).ff(n)g(n)


може бути o ( n ) ? Чи не потрібно, щоб g ( x ) x ? Ваше твердження досі правильне, але доказ йде іншим шляхом, правда? go(n)g(x)x
Ран Г.

@RanG. Оновлено, щоб надати доказ для обох формулювань (я використовував рецептуру в роботі) :)
Alex ten Brink

"для кожної обчислюваної функції g такою, що g = o (n), існує деяка функція f така, що всі задачі, розв'язувані за час O (f (n)), також вирішуються в O (g (f (n)) = o ( f (n)) час "Що робити, якщо всі fs, які існують для цього g, знаходяться в O (1)? Тоді O (g (f (n)) все ще є O (1) і, отже, не o (1).
sepp2k

@ sepp2k: хороший улов, це справді проблема, сформульована. Я оновив свою відповідь.
Алекс десять Брінк

12

Для кожної обчислюваної функції чи існує проблема, яку можна вирішити в кращому випадку за Θ ( f ( n ) ) час, чи існує обчислювальна функція f така, що кожна проблема, яку можна вирішити в O ( f ( n ) ), також може розв’язатись в o ( f ( n ) ) час?fΘ(f(n))fO(f(n))o(f(n))

Якщо - функція , що може бути сконструйована за часом , то теорема часової ієрархії говорить, що існують проблеми, які потребують часу O ( f ( n ) ) , і їх неможливо вирішити з часом o ( f ( n )fO(f(n)). Зокрема, DTIME(o(f(n)o(f(n)log(f(n)))

DTIME(o(f(n)log(f(n))))DTIME(f(n))

Це враховує лише проблеми з рішенням і не враховує час, необхідний для отримання результату.


Я маю рацію припускати, що якщо ми розглянемо неконструктивні функції, відповідь на моє запитання - «ні»? Або пов'язано з цим: якщо функція не може бути сконструйована за часом і, отже, немає машини Тюрінга, яка зупиняється після кроків f ( n ) , чи означає це, що також немає машини Тюрінга, яка зупиняється після steps ( f ( n ) ) кроків? Бо з цього випливало б банально, що відповідь на моє запитання - ні. ff(n)Θ(f(n))
sepp2k

Це залежить. Припустимо, що не може бути сконструйований часом, але може бути обмежений якоюсь іншою функцією g, яка може бути сконструйована часом. f = Θ ( g ), і все ще існує проблеми, які можна вирішити за часом O ( f ), але не надто менше, ніж це. fgf=Θ(g)O(f)
Ран Г.

і, використовуючи кілька стрічок TM, ви можете покращити результат від too(f(n)). o(f(n)lgf(n))o(f(n))
Каве

3

Я спробую надати щось рамки, сподіваючись, що це дасть глибше розуміння.

Коли ви добираєтесь до чогось такого фундаментального, всюди виникають несподівані підводні камені. Наприклад: що таке "вирішення" проблеми? Часто в галузі інформатики ми розглядаємо лише варіант "рішення", в якому нам надають вклад і потрібно лише вивести True або False. Ви зосереджуєтесь на проблемі "функції".

Якщо ви вважаєте, що позначення O (f (n)) намагається зафіксувати, скільки "роботи" потрібно, щоб вирішити проблему, використання рішення замість функції (де потрібен вихід) здається кращим, оскільки ви чітко відокремлюєте обчислення від форматування виводу. .

Я не думаю, що це відповість на ваше запитання, але вас це може зацікавити: http://en.wikipedia.org/wiki/Time_hierarchy_theorem

Також будьте уважні до теореми про швидкість .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.