Алгоритми вищого порядку


35

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

Деякі з них також другого порядку, але дещо цікавіші:

  • Пальці, параметризовані моноїдами
  • Розщеплення пальця на монотонний присудок
  • Алгоритми суми префіксів, знову ж таки параметризовані моноїдом або присудком тощо

Нарешті, деякі є "справді" вищого порядку в тому сенсі, який мені найбільш цікавий:

  • Комбінатор Y
  • Списки різниць

Чи існують інші нетривіальні алгоритми вищого порядку?

Намагаючись уточнити моє запитання, під "нетривіальним вищим порядком" я маю на увазі "використання засобів вищого порядку обчислювального формалізму критично в інтерфейсі та / або реалізації алгоритму"


3
Я запитав щось подібне одного разу. Кілька відповідей тут: caml.inria.fr/pub/ml-archives/caml-list/2004/09/…
Radu GRIGо

Ви, хлопці, говорите про алгоритми, які приймають алгоритми та / або повертають алгоритми?
Pratik Deoghare

Відповіді:


13

На http://math.andrej.com/ існує багато функцій вищого порядку , наприклад, у публікації про подвійні експоненти з'являється такий тип Haskell (із розширеними синонімами типу):

shift :: Bool -> ((Int -> Bool) -> Bool) -> ((Int -> Bool) -> Bool)

Ви також можете дуже розважитися публікацією Haskell Monad для нескінченного пошуку в кінцевий час - наприклад:

newtype S a = S ((a -> Bool) -> a)
bigUnion :: S (S a) -> S a

Я думаю, тип bigUnion 4-го чи 5-го порядку!


22

є купа алгоритмів, які є "справді 2-го порядку", хоча зазвичай не описані в цих умовах. Всякий раз, коли у нас є сублінійні алгоритми часу, неявна доступність оракул до входу, тобто реально трактувати вхід як функцію.

Приклади:

(1) Алгоритми Еліпсоїда під час роботи з "оракул розділення" (наприклад, http://math.mit.edu/~vempala/18.433/L18.pdf )

(2) мінімізація субмодульних функцій (наприклад, http://people.commerce.ubc.ca/facturing/mccormick/sfmchap8a.pdf )

(3) Все поле тестування власності насправді має таку форму ( http://www.wisdom.weizmann.ac.il/~oded/test.html )

(4) Комбінаторні аукціони в моделі запитів (наприклад, http://pluto.huji.ac.il/~blumrosen/papers/iter.pdf )


15

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

Дозвольте бути більш точним: хоча дійсно існують актуальні алгоритми вищого порядку, на практиці завжди можна переписати кожен екземпляр як суто програму першого порядку. Іншими словами, немає насичених програм вищого порядку - по суті тому, що введення / вихід програм є бітовими рядками. [Так, ці бітові рядки можуть представляти функції, але в цьому справа: вони представляють функції, вони не є функціями].

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


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

1
@jkff: Я згоден з вашим першим моментом - ми, безумовно, повинні обговорити ці внутрішні властивості. Я категорично не погоджуюся з другим моментом: ви якось стверджуєте, що розширення та посилення - це «те саме», що явно неправдиво. [Нагадує мені картину Матісса "це не труба"]
Жак Карет

А, так, "Зрада конверсії Ети". (\\() -> "Ceci n'est pas une fonction") ()
CA McCann

Я стверджую, що якщо дві речі рівнозначні (представляючи один одного), ви не можете заперечувати існування однієї з них :)
jkff

@jkff: важко з цим не погодитися!
Жак Каретт

13

У бібліотеках комбінаторів парсера порядок функції, як правило, досить високий. Ознайомтесь із функціями вищого порядку для розбору або навіщо кому-небудь хотіти використовувати функцію шостого порядку? Кріс Окасакі. Журнал функціонального програмування , 8 (2): 195-199, березень 1998.


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

13

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

Клаус Вайрах говорив про це як про Ієрархію ефективності обчислювальної топології другого типу . Докладніше про це дивіться у Weihrach & Grubba, 2009, Elementary Computable Topology , та на сторінці дослідження Джона Таккера, Computation with Topological Data . У своєму запитанні я згадую сторінку Таккера, Програми Канторського простору .


І це поширюється цілком природно на обчислювані математичні об'єкти загалом: інші обчислювані числа (не обов'язково реальні), обчислювані елементи нескінченних груп (кільця, алгебри, ...), обчислювальні точки в просторах і т. Д. У всіх таких випадках алгоритмічний теорія стосується вилучення інформації з функціонального подання (як обчислити математичний об'єкт), а не з самого об'єкта.
ex0du5

13

Модуль неперервності функціоналу являє собою карту , mяка приймає (безперервний) функціональна F : (nat -> nat) -> natі виводить число kтаких , що F f = F gвсякий раз , коли f i = g iдля всіх i < k. Існують алгоритми для обчислення модуля безперервності (не дуже ефективні), що робить його примірником алгоритму 3-го порядку.


9

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

С:0,1н0,1мА (α,L,ϵ)СнАМ1,,МL

ш0,1м,ПrА[м, (Аг(С(м),ш)α i[L], j[н], ПrМi[Мi(j)=мj]1-ϵ)]2/3

АгА2/3ϵммα


5

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

Під час свого доктора наук (з обчислювальної хімії) я реалізував багато алгоритмів графіків у формі вищого порядку, щоб застосувати їх до аналізу неявних графіків, головним чином тому, що мої фактичні графіки були нескінченними, тому я не міг дозволити собі явно зберігати їх! Зокрема, я вивчав топологію аморфних матеріалів, представлених як 3D обшивки одиничних клітин (надклітин).

Наприклад, ви можете написати функцію для обчислення n-ї найближчої оболонки сусідньої вершини початку, iнаприклад:

nth i 0 = {i}
nth i 1 = neighbors i
nth i n = diff (diff (fold union empty (map neighbors (nth i (n-1)))) (nth i (n-1))) (nth i (n-2))

де neighborsфункція, яка повертає набір сусідніх вершин до даної вершини.

Наприклад, 2D квадратна решітка:

neighbors (x, y) = {(x-1, y), (x+1, y), (x, y-1), (x, y+1)}

Інші цікаві алгоритми в цьому контексті містять статистику найкоротшого кільця шляху Францблау.


Це підводить мене до питання, яке у мене було колись. Якщо існують програмні способи визначення графіків таким чином, чи є спосіб визначити парадоксальний графік самореференції?
Суреш Венкат

1
{х:хх}{х:хх}

Звичайно. Але це графік самореференції ?
Суреш Венкат

@Suresh: Це графік, визначений функціональною мовою в тому сенсі, що є тип Uвершин і функція U -> U -> Boolребер.
sdcvvc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.