Як моделюється складність алгоритму для функціональних мов?


38

Складність алгоритму розроблена таким чином, щоб він не залежав від деталей нижчого рівня, але він заснований на імперативній моделі, наприклад, доступ до масиву та модифікація вузла в дереві займають час O (1). Це не так у чисто функціональних мовах. Список Haskell потребує лінійного часу для доступу. Модифікація вузла на дереві передбачає створення нової копії дерева.

Чи повинно бути альтернативне моделювання складності алгоритму для функціональних мов?


3
Це може бути те, що ви шукаєте.
Арісту

1
Тут можна відповісти на ваше запитання: cs.stackexchange.com/q/18262/755 . Зокрема, часова складність в чисто функціональній мові відрізняється від часової складності в імперативній мові щонайбільше співвідношенням , для деяких відповідних припущень щодо можливостей обох мов. O(logn)
DW

3
GHC Haskell підтримує змінні масиви та дерева та інше, дозволяючи робити доступ до масиву та змінювати вузли дерев за O (1) час, використовуючи "потоки стану" ( STмонади).
Tanner Swett

1
@BobJarvis Залежить. Чи є список для вас абстрактним типом даних чи ви конкретно розглядаєте пов'язані списки?
Рафаель

1
Якої мети ви шукаєте для моделювання алгоритмічної складності? Шукаєте щось математично чисте чи практичне? Для практичної цінності слід звернути увагу на такі речі, як наявність у вас запам'ятовування чи ні, але, з точки зору математичного пуриста, можливості реалізації не повинні мати значення.
Корт Аммон

Відповіді:


34

Якщо ви припускаєте, що -рахунок є хорошою моделлю функціональних мов програмування, то можна подумати: λ -калькуляція має, здавалося б, просте поняття про складність у часі: просто порахуйте кількість β -редукційних кроків ( λ x . M ) N M [ N / x ] .λλβ(λх.М)NМ[N/х]

Але це хороший захід складності?

Щоб відповісти на це питання, ми повинні уточнити, що ми маємо на увазі в першу чергу під мірою складності. Одну хорошу відповідь дає теза Слота та Ван Емда Боаса : будь-яка міра складності повинна мати поліноміальну залежність від канонічного поняття про складність у часі, визначеного за допомогою машин Тьюрінга. Іншими словами, повинно бути "розумне" кодування Від λ -калькуляційних термінів до машин Тьюрінга, таких як для деякого полінома p , це стосується того, що для кожного терміна M розміру | М | : M зменшується до значення в p ( | M |тr(.)λpМ|М|Мβ -редукційні кроки саме тоді, коли t r ( M ) зменшується до значення в p ( | t r ( M ) | ) кроків машини Тьюрінга.p(|М|) βтr(М)p(|тr(М)|)

Тривалий час було незрозуміло, чи можна цього досягти при λ-обчисленні. Основні проблеми полягають у наступному.

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

β

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


23

Складність алгоритму розроблена так, щоб не залежати від деталей нижчого рівня.

Ні, не дуже. Ми завжди рахуємо елементарні операції в деяких моделях машин:

  • Сходи для машин Тьюрінга.
  • Основні операції на ОЗУ.

ΩΘОΘ

Тому у вашому запитанні є проста відповідь: зафіксуйте модель машини та які «операції» потрібно порахувати. Це дасть вам в міру. Якщо ви хочете, щоб результати були порівнянні з нефункціональними алгоритмами, вам найкраще слугувати для складання ваших програм до оперативної пам’яті (для аналізу алгоритмів) або TM (для теорії складності) та аналізу результату. Для полегшення цього процесу можуть існувати теореми передачі.


Домовились. Примітка сторони: люди дійсно часто роблять багато помилок , про те, що операції «константа». Наприклад, якщо + дійсно, O(1)коли це насправдіO(log ab)
Пол Дрейпер,

3
@PaulDraper Це інше припущення, не обов'язково помилка. Ми можемо моделювати те, що хочемо - питання, якщо воно відповідає на цікаві запитання. Дивіться також тут .
Рафаель

це звучить дуже жахливо, як "позбутися моделі машини"
Пол Дрейпер

@PaulDraper Залежить від того, які настрої ви додаєте до слова "машина". Дивіться також цю дискусію . FWIW, модель оперативної пам'яті за одиницю вартості - можливо, стандартна модель в аналізі алгоритму! - це корисно, інакше вона не була б використана протягом десятиліть. Усі знайомі межі для сортування, пошуку трасів тощо базуються на цій моделі. Це має сенс, оскільки він моделює справжні комп’ютери так само добре, поки цифри вписуються в регістри.
Рафаель

1

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


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