Существует ли концепция алгоритма, вычисляющего функцию, сначала найдя другой алгоритм?

14

Если я правильно понимаю, алгоритм, который вычисляет значение действительной функции имеет вычислительную сложность если выполняется следующее: Когда мы вычисляем с точностью требуется порядка шагов ,fO(g(n))fδg(n)

Однако что если у нас есть алгоритм, который сначала «находит более эффективный алгоритм для вычисления », а затем вычисляет ?ff

Другими словами, что если у нас есть алгоритм который выполняет следующее:A

  1. Найти эффективный алгоритм для вычисления .Bf

  2. используйте для вычисления .Bf

Не в этом случае, мы больше не можем говорить о вычислительном времени, которое потребуется для вычисления , например, потому что она полностью зависит от того , алгоритм уже найден алгоритм . Другими словами, время вычислений, необходимое для вычисления если является первым составным числом, намного больше, чем время вычислений, необходимое для вычисления после того, как уже вычислено.f(5)ABf(5)5f(5)f(3)

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

user56834
источник
1
Вы бы сказали, что Mathematica в основном выполняет то, что вы просите? Вы даете ему уравнения для решения, и он автоматически определяет, какой алгоритм использовать для решения этих уравнений, а затем решает их.
user541686
Проверьте itu.dk/people/sestoft/pebook , это актуально.
Натан Ринго,

Ответы:

18

Существует хорошо известный алгоритм, универсальный алгоритм поиска Левина, режим работы которого идентичен. Рассмотрим, например, проблему поиска удовлетворительного присваивания для формулы, которая гарантированно выполнима. Универсальный поиск Левина запускает все потенциальные алгоритмы параллельно, и, если какой-либо алгоритм выводит удовлетворительное назначение, останавливает и выводит это назначение. Если оптимальный алгоритм для задачи выполняется за время , то алгоритм Левина работает за время O ( f ( n ) ) (возможно с огромной постоянной), если он реализован правильно.f(n)O(f(n))

Хотя алгоритм Левина непрактичен (из-за огромных констант), теоретически он очень интересен. См. Статью Scholarpedia для получения дополнительной информации об универсальном поиске.

Юваль Фильмус
источник
10

Предположим, у нас есть функция, fкоторая принимает аргумент xтипа Aи выводит другую функцию, которая принимает аргумент yтипа Bи возвращает результат типа C. По вашим словам, fпринимает аргумент xи возвращает «алгоритм», который принимает входные данные типа Bи выводит результаты типа C.

Функция fимеет тип

A → (B → C)

Действительно, он принимает x : Aи возвращает функцию типа B → C. Но такой fэквивалент эквивалентен функции, g : A × B → Cкоторая принимает оба x и yсразу и дает вам конечный результат. Действительно, между типами существует изоморфизм

A → (B → C)

и

A × B → C

потому что мы можем определить gс точки зрения fкак

g(x, y) := f(x)(y)

и мы можем определить fс точки зрения gкак

f(x) := (y ↦ g(x,y))

Операция перехода от gк fназывается каррингом, и функциональные программисты используют ее постоянно. В теории вычислимости идея взять один вход и вывести функцию (алгоритм) воплощена в теореме smn .

Ответ на ваш вопрос: «Да, люди делают это постоянно». Но есть и мораль: алгоритм, который находит алгоритм, - это всего лишь алгоритм.

Андрей Бауэр
источник
1
+1 за последнее предложение. Хорошо сказано.
Джон Колман
f(5)c+ccf(5)f(5)c1+c2c1c2c1>c2
@ Programmer2134 - будет ли вам интересна оптимизация компилятора? Я вообще не уверен в теории, стоящей за этим (особенно в ее взаимодействиях с теорией сложности), но это может быть потенциальным примером
Марк
Модное слово для поиска - «частичная оценка».
Андрей Бауэр