La plupart des algorithmes bien connus sont du premier ordre, en ce sens que leur entrée et leur sortie sont des données "simples". Certaines sont de second ordre de manière triviale, par exemple le tri, les hashtables ou les fonctions map et fold: elles sont paramétrées par une fonction, mais elles ne font vraiment rien d’intéressant avec elle, si ce n’est l’invoquer sur des morceaux d’autres données d’entrée.
Certains sont aussi de second ordre mais un peu plus intéressants:
- Fingertrees paramétrés par des monoïdes
- Fractionner un doigt sur un prédicat monotone
- Algorithmes de somme de préfixes, là encore généralement paramétrés par un monoïde ou un prédicat, etc.
Enfin, certains sont "véritablement" d'ordre supérieur dans le sens qui m'intéresse le plus:
- Le combinateur Y
- Listes de différences
Existe-t-il d'autres algorithmes d'ordre supérieur non triviaux?
Dans le but de clarifier ma question, j'entends par "d'ordre supérieur non trivial" l'utilisation "de fonctions critiques du formalisme de calcul de manière critique dans l'interface et / ou la mise en oeuvre de l'algorithme".
Réponses:
Il y a beaucoup de fonctions d'ordre supérieur sur http://math.andrej.com/ , par exemple dans l'article sur les doubles exponentielles , le type Haskell suivant apparaît (avec les synonymes de type développés):
Vous pouvez également vous amuser beaucoup avec le post Une monade Haskell pour une recherche infinie en temps fini - par exemple:
Je suppose que le type de bigUnion est 4ème ou 5ème ordre!
la source
il y a un tas d'algorithmes qui sont "vraiment du second ordre" bien qu'ils ne soient généralement pas décrits explicitement dans ces termes. Chaque fois que nous avons des algorithmes temporels sub-linéaires, implicite est une sorte d’accès oracle à l’entrée, c’est-à-dire qu’elle traite l’entrée comme une fonction.
Exemples:
(1) Les algorithmes Ellipsoïdes lorsqu’on travaille avec un "oracle de séparation" (par exemple http://math.mit.edu/~vempala/18.433/L18.pdf )
(2) Minimisation de fonctions sous-modulaires (par exemple, http://people.commerce.ubc.ca/faculty/mccormick/sfmchap8a.pdf )
(3) L'ensemble du domaine des tests de propriétés est vraiment de cette forme ( http://www.wisdom.weizmann.ac.il/~oded/test.html )
(4) Ventes aux enchères combinatoires dans le modèle de requête (par exemple, http://pluto.huji.ac.il/~blumrosen/papers/iter.pdf )
la source
Il y a une autre réponse à cette question: il n'y en a pas. Plus spécifiquement, un tel algorithme d'ordre supérieur (implémentable!) Est mécaniquement équivalent à un algorithme du premier ordre, utilisant la défonctionnalisation .
Permettez-moi d'être plus précis: s'il existe effectivement des algorithmes d'ordre supérieur, dans la pratique, il est toujours possible de réécrire chaque instance sous la forme d'un programme purement du premier ordre. En d'autres termes, il n'y a pas de programmes saturés d'ordre supérieur - essentiellement parce que les entrées / sorties des programmes sont des chaînes de bits. [Oui, ces chaînes de bits peuvent représenter des fonctions, mais c'est le but: elles représentent des fonctions, ce ne sont pas des fonctions].
Les réponses déjà données sont excellentes et ma réponse ne doit pas être considérée comme les contredisant. Cela doit être considéré comme une réponse à la question dans un contexte légèrement plus large (programmes complets au lieu d’algorithmes autonomes). Et ce changement de contexte change radicalement la réponse. Le but de ma réponse est de rappeler cela aux gens, ce qui est trop facile à oublier.
la source
(\\() -> "Ceci n'est pas une fonction") ()
Dans les bibliothèques de combinateur d’analyseurs, l’ordre de la fonction est généralement assez élevé. Découvrez les fonctions d'ordre supérieur même pour l'analyse ou pourquoi quelqu'un voudrait-il utiliser une fonction d'ordre sixième? par Chris Okasaki. Journal of Functional Programming , 8 (2): 195-199, mars 1998.
la source
L'analyse informatisée caractérise les nombres réels par programmation, car les nombres réels contiennent une quantité d'informations sans limite, de sorte que les opérations sur les nombres réels sont d'ordre supérieur dans le sens des questions. En règle générale, les nombres réels sont présentés à l'aide d'une vue topologique sur le flux infini de bits, l'espace de Cantor, qui présente un intérêt pour le domaine plus vaste de la topologie calculable.
Klaus Weihrach en a parlé comme de la hiérarchie d'efficacité de type deux de la topologie calculable. Pour plus d'informations à ce sujet, consultez Weihrach & Grubba, 2009, Elementary Computable Topology , et la page de recherche de John Tucker, Computation with Topological Data . Je mentionne la page de Tucker dans ma question, Applications of Cantor Space .
la source
Un module de continuité fonctionnelle est une carte
m
qui accepte un (continu) fonctionnelF : (nat -> nat) -> nat
et délivre en sortie un nombre dek
telle sorte queF f = F g
chaque foisf i = g i
pour toutesi < k
. Il existe des algorithmes pour calculer le module de continuité (ceux qui ne sont pas très efficaces), ce qui en fait une instance d'un algorithme du 3ème ordre.la source
Pour compléter la réponse de Noam , il existe également plusieurs situations où il est important que le résultat soit (une représentation explicite de) une fonction.
la source
Dans les algorithmes de graphe, les sommets et les arêtes sont généralement considérés comme des données simples, mais ils peuvent en fait être généralisés de manière productive de manière à être générés par programme à la demande.
Au cours de mon doctorat (en chimie informatique), j'ai implémenté de nombreux algorithmes de graphes sous forme d'ordre supérieur afin de les appliquer à l'analyse de graphes implicites, principalement parce que mes graphes réels étaient infinis et que je ne pouvais donc pas les stocker explicitement! Plus précisément, j'étudiais la topologie des matériaux amorphes représentés par des pavages 3D de cellules unitaires (supercellules).
Par exemple, vous pouvez écrire une fonction pour calculer le shell le plus proche voisin d'un sommet d'origine
i
comme ceci:où
neighbors
est une fonction qui renvoie l'ensemble des sommets voisins au sommet donné.Par exemple, le réseau carré 2D:
D'autres algorithmes intéressants dans ce contexte incluent les statistiques d'anneaux de chemins les plus courts de Franzblau.
la source
U
de sommets et une fonctionU -> U -> Bool
d'arêtes.