В какой степени алгоритм может предсказать сложность времени произвольной входной программы?

23

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

Тем не менее, я могу, конечно, написать программу, которая может вычислить время выполнения программы вроде:

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

и вернуть временную сложность , даже не запуская ее.N

Для всех других программ ввода он возвращает флаг, указывающий, что он не может определить сложность времени.

У меня вопрос такой:

Какие условия должны выполняться, чтобы мы могли алгоритмически определить временную сложность данной программы?

* Если на это есть каноническая ссылка или обзорная статья, я буду признателен за ссылку в комментариях.

Увлеченные
источник
1
(1) «O-нотация» не означает «сложность времени». (2) Неясно, что вы подразумеваете под «O (бесконечность)». Пожалуйста, по возможности избегайте придумывать новую нотацию. (3) Решение о том, останавливается ли данная программа или нет, и определение явной верхней границы временной сложности программы отличается.
Цуёси Ито
1
Я не знаком с выводом временной сложности программ в ограниченных классах, но один класс программ, который может стоить проверять, называется «программами с ограниченным циклом», для которых легко определить временную сложность. Я помню, что программы с ограниченным циклом обсуждались в главе 3 « Жемчужин теоретической информатики » Уве Шенингом и Рэндаллом Дж. Пруимом в контексте определения эквивалентности двух программ, но я не уверен, насколько эта глава имеет отношение к вашему вопросу.
Цуёси Ито
4
Я немного запутался. Каким образом это выходит за рамки? Одним разумным ответом на вопрос ОП могут быть фрагменты языка (или даже классы фрагментов), для которых время выполнения может быть определено алгоритмически.
Суреш Венкат
4
Смежный вопрос: разрешимы ли оценки времени выполнения в P?
Артем Казнатчеев
7
Я ужасно опоздал на эту ветку комментариев. Мы, кажется, набрасываемся на момент, когда пост пахнет новичком. Я не указываю пальцами. Я чувствую этот инстинкт сам. Может быть, мы должны быть мягче. ФП признал, что не знаком с областью или условиями. Какой смысл в вопросно-ответном сайте, если мы терпим только людей, которые точно знают, чего они хотят, и задаем это на нашем языке.
Виджай Д

Ответы:

23

В общем, вы не можете определить сложность, даже для остановки программ: пусть будет некоторой произвольной машиной Тьюринга, и пусть p T будет программой (которая всегда возвращает 0):TпT

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

Ясно, что в общем случае неразрешимо, является ли линейным или квадратичным временем.пT

Тем не менее, была проведена большая работа по эффективному вычислению сложности программы. У меня есть особая любовь к теории неявной сложности, которая направлена ​​на создание языков, которые, используя специальные конструкции или типовые дисциплины, позволяют писать только программы, которые живут в определенном четко определенном классе сложности. То, что я считаю чудом, эти языки часто являются законченными для этого класса!

Один особенно хороший пример описан в этой статье J.-Y. Марион, которая описывает крошечный императивный язык, с типом дисциплиной вдохновленной от методов информационно-потоков и анализа безопасности, что позволяет характеристику алгоритмов P .

Коди
источник
В качестве дополнительного примечания также см. Эпиграмма, язык, который может гарантировать прекращение.
Реал Слав
Это хорошее начало, но есть что сказать? (Например, мне кажется, что время выполнения данной элементарной рекурсивной функции должно быть простым для вычисления, но такие функции могут решить любую проблему в экспоненциальной иерархии ....)
usul
Поскольку можно определить, что входная программа написана на ограниченном языке, можно предположить, что сложность времени ограничена любой верхней границей, налагаемой этим языком. Тем не менее, многие примитивные рекурсивные функции имеют общие рекурсивные эквиваленты, которые являются более эффективными
Крис Пресси,
1
(случайно сохранил этот комментарий раньше, затем превысил 5-минутный предел. Второе предложение должно читаться следующим образом :) Однако программы на этих ограниченных языках могут иметь эквиваленты на менее ограниченных языках, которые более эффективны (в частности, многие примитивные рекурсивные функции имеют общие рекурсивные эквиваленты, которые более эффективны), что на практике поощряет использование неограниченных, более сложных для анализа языков.
Крис Пресси
Это очень интересно, Крис! У вас есть ссылка? На самом деле это кажется контринутивным: я бы предположил, что примитивные рекурсивные функции могут моделировать общие рекурсивные функции для заданного числа шагов, что затем ограничит ускорение до некоторого постоянного фактора.
Коди
11

Вопрос, который вы задаете, и конкретный подсчет, который вы описываете, является классическим при анализе программ. Существует теоретическая проблема анализа сложности, и это практическое проявление в терминах автоматической оценки производительности фрагмента кода. Такой автоматический анализ имеет несколько приложений, от обнаружения ошибок производительности до оценки стоимости некоторых вычислений в облаке.

Коди отметил, что проблема в общем неразрешима. Эта проблема сложнее, чем доказательство завершения, потому что получение границы сложности влечет за собой то, что программа также завершается. Есть два подхода к такой проблеме. Один из анализа программы. Идея добавления счетчика и оценки его стоимости существует с 70-х годов. Это кодирование сводит проблему определения времени выполнения к вычислению инварианта.

Второй подход заключается в разработке языка программирования, который допускает только программы определенной ограниченной сложности. Это область неявной вычислительной сложности.

Ниже приведены некоторые ссылки для обеих областей.

  1. Проект SPEED - это одна из конкретных линий анализа программы, которая фокусируется на том, как найти границы на счетчиках после их введения в программу. Счетчики могут измерять время или пространство.
  2. Многофакторный амортизированный анализ ресурсов , Ян Хоффман, Клаус Элиг, Мартин Хоффман, ACM TOPLAS 2012
  3. О разрешимых скоростных свойствах императивных программ , Амир Бен Амрам, «Разработки в неявной вычислительной сложности 2010». Это прекрасная работа по ограничению сложности императивных программ синтаксическими ограничениями.
Виджай Д
источник