Сложность алгоритма разработана так, чтобы не зависеть от деталей более низкого уровня, но она основана на императивной модели, например, доступ к массиву и изменение узла в дереве занимают O (1) времени. Это не так в чисто функциональных языках. Список Haskell требует линейного времени для доступа. Модификация узла в дереве включает создание новой копии дерева.
Тогда должно ли быть альтернативное моделирование сложности алгоритма для функциональных языков?
ST
монады).Ответы:
Если вы предполагаете, что калькуляция является хорошей моделью функциональных языков программирования, то можно подумать: λ- калькуляция имеет, казалось бы, простое понятие сложности времени: просто посчитайте количество шагов β- редукции ( λ x . M ) N → M [ N / x ] .λ λ β (λx.M)N→M[N/x]
Но это хорошая мера сложности?
Чтобы ответить на этот вопрос, мы должны уточнить, что мы подразумеваем под мерой сложности в первую очередь. Один хороший ответ дает тезис Слота и Ван Эмде Боаса : любая хорошая мера сложности должна иметь полиномиальное отношение к каноническому понятию сложности времени, определенному с помощью машин Тьюринга. Другими словами, должна быть «разумная» кодировка Из терминов λ- исчисления в машины Тьюринга, например, для некоторого полинома p , это случай, когда для каждого члена M размера | М | : M сводится к значению в p ( | M |tr(.) λ p M |M| M β- уменьшение шагов точно, когда t r ( M ) уменьшается до значения в p ( | t r ( M ) | ) шагов машины Тьюринга.p(|M|) β tr(M) p(|tr(M)|)
Долгое время было неясно, может ли это быть достигнуто в λ-исчислении. Основными проблемами являются следующие.
Статья Б. Аккаттоли и У. Дала Лаго « Бета-редукция является инвариантной, действительно » проясняет проблему, показывая «разумное» кодирование, которое сохраняет класс сложности P полиномиальных функций времени, предполагая, что крайние слева-крайние сокращения вызовов по имени , Ключевым моментом является то, что экспоненциальный взрыв может произойти только по «неинтересным» причинам, которые могут быть побеждены надлежащим обменом. Другими словами, класс P один и тот же, независимо от того, определяете ли вы его, считая шаги машины Тьюринга или (крайний левый-крайний) сокращения.β
Я не уверен, что ситуация для других стратегий оценки. Я не знаю, что подобная программа была выполнена для космической сложности.
источник
Нет, не совсем. Мы всегда считаем элементарные операции в некоторой модели машины:
Поэтому на ваш вопрос есть простой ответ: исправить модель машины и какие «операции» рассчитывать. Это даст вам в меру. Если вы хотите, чтобы результаты были сопоставимы с нефункциональными алгоритмами, вам лучше всего скомпилировать свои программы в ОЗУ (для анализа алгоритмов) или TM (для теории сложности) и проанализировать результат. Для облегчения этого процесса могут существовать теоремы о переносе.
источник
O(1)
это когда это действительно такO(log ab)
Вместо того, чтобы формулировать свою меру сложности в терминах некоторой базовой абстрактной машины, вы можете включить стоимость в сами определения языка - это называется динамикой затрат . Каждый прилагает стоимость к каждому правилу оценки на языке композиционным способом, то есть стоимость операции является функцией стоимости ее подвыражений. Этот подход наиболее естественен для функциональных языков, но он может использоваться для любого четко определенного языка программирования (конечно, большинство языков программирования, к сожалению, не определены).
источник