Большинство известных алгоритмов первого порядка в том смысле, что их ввод и вывод являются «простыми» данными. Некоторые из них являются вторым порядком тривиальным способом, например, сортировка, хеш-таблицы или функции map и fold: они параметризуются функцией, но на самом деле они не делают с ней ничего интересного, кроме как вызывают ее для фрагментов других входных данных.
Некоторые из них также второго порядка, но несколько интереснее:
- Пальцы, параметризованные моноидами
- Расщепление дерева пальцев на однообразный предикат
- Алгоритмы суммирования префиксов, опять же обычно параметризованные моноидом или предикатом и т. Д.
Наконец, некоторые из них «действительно» более высокого порядка в том смысле, который мне наиболее интересен:
- Y комбинатор
- Списки различий
Существуют ли другие нетривиальные алгоритмы высшего порядка?
В попытке прояснить мой вопрос, под «нетривиальным высшим порядком» я подразумеваю «использование средств вычислительного формализма более высокого порядка критически в интерфейсе и / или реализации алгоритма»
Ответы:
На http://math.andrej.com/ есть много функций высшего порядка , например, в посте о двойных экспонентах появляется следующий тип языка Haskell (с расширенными синонимами типа):
Вы также можете получить массу удовольствия от поста «Монада Хаскелла для бесконечного поиска за конечное время», например:
Я думаю, что тип bigUnion 4-го или 5-го порядка!
источник
Есть множество алгоритмов, которые «действительно 2-го порядка», хотя обычно не описаны явно в этих терминах. Всякий раз, когда у нас есть сублинейные алгоритмы времени, неявный - это своего рода доступ к входу оракула, то есть действительно обработка входа как функции.
Примеры:
(1) Алгоритмы эллипсоидов при работе с «оракулом разделения» (например, http://math.mit.edu/~vempala/18.433/L18.pdf )
(2) Минимизация субмодулярных функций (например, http://people.commerce.ubc.ca/faculty/mccormick/sfmchap8a.pdf )
(3) Вся область тестирования свойств действительно имеет такую форму ( http://www.wisdom.weizmann.ac.il/~oded/test.html )
(4) Комбинаторные аукционы в модели запросов (например, http://pluto.huji.ac.il/~blumrosen/papers/iter.pdf )
источник
На этот вопрос есть другой ответ: их нет. Более конкретно, любой такой (реализуемый!) Алгоритм более высокого порядка механически эквивалентен алгоритму первого порядка с использованием дефункционализации .
Позвольте мне быть более точным: хотя действительно существуют алгоритмы высшего порядка, на практике всегда можно переписать каждый экземпляр как программу первого порядка. Другими словами, не существует насыщенных программ высшего порядка - в основном потому, что ввод / вывод программ - это битовые строки. [Да, эти битовые строки могут представлять функции, но в том-то и дело: они представляют функции, они не являются функциями].
Ответы, которые уже даны, превосходны, и мой ответ не должен рассматриваться как противоречащий им. Это следует рассматривать как ответ на вопрос из более широкого контекста (полные программы вместо автономных алгоритмов). И это изменение контекста меняет ответ довольно радикально. Суть моего ответа - напомнить людям об этом, что слишком легко забыть.
источник
(\\() -> "Ceci n'est pas une fonction") ()
В библиотеках комбинатора синтаксического анализа порядок функции обычно довольно высок. Проверьте даже функции высшего порядка для разбора или почему кто-то когда-либо хотел использовать функцию шестого порядка? Крис Окасаки. Журнал функционального программирования , 8 (2): 195-199, март 1998.
источник
Вычислительный анализ программно характеризует действительные числа, так как действительные числа содержат неограниченный объем информации, и поэтому операции с действительными числами имеют более высокий порядок в смысле вопросов. Как правило, действительные числа представляются с использованием топологического представления о бесконечном потоке битов, пространстве Кантора, что представляет интерес для более широкого поля вычислимой топологии.
Клаус Вейрах говорил об этом как о иерархии второго типа эффективности вычислимой топологии. Подробнее об этом см. В Weihrach & Grubba, 2009, Elementary Computable Topology , и на исследовательской странице Джона Такера « Вычисления с топологическими данными» . Я упоминаю страницу Такера в моем вопросе, Применения Пространства Кантора .
источник
Модуль непрерывности функционала представляет собой карту ,
m
которая принимает (непрерывный) функциональнаF : (nat -> nat) -> nat
и выводит числоk
таких , чтоF f = F g
всякий раз , когдаf i = g i
для всехi < k
. Существуют алгоритмы для вычисления модуля непрерывности (не очень эффективные), что делает его экземпляром алгоритма 3-го порядка.источник
Чтобы дополнить ответ Ноама , есть также несколько ситуаций, когда важно, чтобы выходные данные были (явным представлением) функции.
источник
In graph algorithms, vertices and edges are usually thought of as being plain data but they can actually be productively generalized so that they are programmatically generated on-demand.
During my PhD (in computational chemistry) I implemented many graph algorithms in higher-order form in order to apply them to the analysis of implicit graphs, mainly because my actual graphs were infinite so I could not afford to store them explicitly! Specifically, I was studying the topology of amorphous materials represented as 3D tilings of unit cells (supercells).
For example, you can write a function to compute the nth-nearest neighbor shell of an origin vertex
i
like this:where
neighbors
is a function that returns the set of neighboring vertices to the given vertex.For example, the 2D square lattice:
Other interesting algorithms in this context include Franzblau's shortest path ring statistics.
источник
U
of vertices and a functionU -> U -> Bool
of edges.