Наскільки алгоритм може передбачити часову складність довільної програми введення?


23

Проблема зупинки зазначає, що неможливо написати програму, яка може визначити, чи припиняється інша програма, для всіх можливих програм введення .

Однак я, безумовно, можу написати програму, яка може обчислити час роботи програми на зразок:

for(i=0; i<N; i++)
    { x = 1; }

і повернути часову складність , не запускаючи її ніколи.N

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

Моє запитання таке:

Які умови повинні виконуватися, щоб ми могли алгоритмічно визначити складність у часі даної програми?

* Якщо є канонічна довідкова або оглядова стаття на це, я вдячний посиланням на це в коментарях.


1
(1) "O-позначення" не означає "часова складність". (2) Незрозуміло, що ви маєте на увазі під "O (нескінченність)". Будь ласка, уникайте придумувати нове позначення, якщо можливо. (3) Прийняття рішення щодо того, припиняється чи ні програма, та надання чіткої верхньої межі часової складності програми є різною.
Цуйосі Іто

1
Я не знайомий з тим, що визначає складність часу в програмах з обмеженими класами, але один клас програм, який, можливо, варто перевірити, називається "обмеженими програмами циклу", для яких легко пов'язати часову складність. Я пам’ятаю, що програми з обмеженим циклом обговорюються у розділі 3 « Самоцвіти теоретичної комп’ютерної науки » Уве Шенінга та Рендалла Дж. Пруіма в контексті вирішення еквівалентності двох програм, але я не впевнений, наскільки відповідна глава стосується вашого питання.
Цуйосі Іто

4
Я трохи розгублений. Яким чином це виходить за межі? Однією розумною відповіддю на питання ОП були б мовні фрагменти (або навіть класи фрагментів), для яких час роботи можна визначити алгоритмічно.
Суреш Венкат


7
Я страшенно запізнююся на цю тему коментарів. Ми, здається, підкидаємо момент, коли повідомлення пахне новачками. Я не вказую пальцями. Я сам відчуваю цей інстинкт. Можливо, ми повинні бути ніжнішими. ОП визнала, що не знайома з областю чи умовами. Який сенс сайту-відповідей на питання, якщо ми терпимо лише людей, які точно знають, чого хочуть, і запитують це нашою мовою.
Vijay D

Відповіді:


23

ТpТ

input: n
run T for n steps
if T is in halting state, output: 0
otherwise, loop for n^2 steps and output: 0

pТ

Однак проведено велику роботу щодо ефективного обчислення складності програми. Я особливо захоплююсь теорією непрямої складності, яка спрямована на створення мов, які за допомогою спеціальних конструкцій або типів дисциплін дозволяють писати лише програми, які населяють певний чітко визначений клас складності. Що я вважаю дивом, ці мови часто є повноцінними для цього класу!

Один особливо приємний приклад описаний у цій роботі J.-Y. Маріон, яка описує крихітний імперативний мову, з типом дисципліною натхненної від методів інформаційно-потоків і аналізу безпеки, що дозволяє характеристику алгоритмів P .


В якості побічної примітки також дивіться Епіграму, яка є мовою, яка може гарантувати припинення.
Realz Slaw

Це приємний початок, але чи можна сказати більше? (Наприклад, мені здається, що час виконання елементарної рекурсивної функції повинен бути простим для обчислення, але такі функції можуть вирішити будь-яку проблему в експонентній ієрархії ....)
usul

Наскільки можна визначити, що програма введення написана мовою з обмеженим доступом, ви можете припустити, що часова складність обмежена будь-якою верхньою межею, яку накладає мова. Однак багато примітивних рекурсивних функцій мають загальні рекурсивні еквіваленти, які є більш ефективними
Кріс Прессі

1
(випадково збережено цей коментар достроково, а потім перевищив 5-хвилинний ліміт. Друге речення має бути наступним чином :) Однак програми на цих обмежених мовах можуть мати еквіваленти в менш обмежених мовах, які є більш ефективними (зокрема, багато примітивних рекурсивних функцій мають загальні рекурсивні еквіваленти, які є більш ефективними), що на практиці заохочує використання необмежених мов, які важче аналізуються.
Кріс Прессі

Це дуже цікаво Кріс! У вас є довідник? Насправді це здається контр-інтуїтивним: я б підозрював, що примітивні рекурсивні функції можуть імітувати загальні рекурсивні функції за певну кількість кроків, які потім обмежуватимуть швидкість деяким постійним фактором.
коді

11

Питання, яке ви ставите, та конкретний фокус підрахунку, який ви описуєте, є класичним у аналізі програм. Існує теоретична проблема аналізу складності, і це практичний прояв з точки зору автоматичної оцінки продуктивності фрагмента коду. Такий автоматизований аналіз має кілька застосувань: від виявлення помилок продуктивності до оцінки вартості деяких обчислень у хмарі.

Коді зазначив, що проблема взагалі не вирішена. Ця проблема складніше, ніж довести припинення, оскільки отримання обмеженої складності означає, що програма також припиняється. Існує два підходи до такої проблеми. Один - з програмного аналізу. Ідея додати лічильник та оцінити його значення існує з 70-х років. Це кодування зводить проблему визначення часу роботи до обчислення інваріанта.

Другий підхід полягає в розробці мови програмування, який допускає програми лише певної обмеженої складності. Це область неявної обчислювальної складності.

Деякі посилання на обидві області випливають.

  1. Проект SPEED - це одна конкретна лінія роботи з аналізу програм, яка фокусується на тому, як знайти межі лічильників, щойно введені в програму. Лічильники можуть вимірювати витрату часу або місця.
  2. Багатовимірний аналіз амортизованих ресурсів , Ян Гофман, Клаус Ейліг, Мартін Гофман, ACM TOPLAS 2012
  3. Про вирішальні властивості швидкості зростання імперативних програм , Амір Бен Амрам, розвиток імпліцитної обчислювальної складності 2010 року. Це прекрасна лінія роботи над обмеженням складності імперативних програм синтаксичними обмеженнями.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.