Algorithmes d'ordre supérieur


35

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".


3
J'ai demandé quelque chose de similaire une fois. Quelques réponses ici: caml.inria.fr/pub/ml-archives/caml-list/2004/09/…
Radu GRIGore

Est-ce que vous parlez d'algorithmes qui prennent des algorithmes et / ou des algorithmes de retour?
Pratik Deoghare

Réponses:


13

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):

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

Vous pouvez également vous amuser beaucoup avec le post Une monade Haskell pour une recherche infinie en temps fini - par exemple:

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

Je suppose que le type de bigUnion est 4ème ou 5ème ordre!


22

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 )


15

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.


Je conviens qu'un algorithme d'ordre supérieur est équivalent à un algorithme de premier ordre avec la même spécification externe, mais cela ne devrait pas nous empêcher d'argumenter au sujet de leurs propriétés internes. Il n'y a pas de différence entre représenter quelque chose et être quelque chose.
jkff

1
@ jkff: Je suis d'accord avec votre premier point - nous devrions absolument discuter de ces propriétés internes. Je suis catégoriquement en désaccord avec le deuxième point: vous prétendez en quelque sorte que les extensions et les intentions sont «identiques», ce qui est manifestement faux. [Cela me rappelle le tableau de Matisse 'Ce n'est pas une pipe']
Jacques Carette Le

Ah oui, "La trahison de la conversion Eta". (\\() -> "Ceci n'est pas une fonction") ()
CA McCann

Je prétends que si deux choses sont équivalentes (en se représentant), vous ne pouvez pas nier l'existence de l'une d'entre elles :)
jkff

@jkff: difficile de ne pas être d'accord avec ça!
Jacques Carette le

13

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.


C'est un excellent article, mais pas tout à fait ce que je recherche. Bien que les combinateurs soient d'ordre supérieur, ils sont très simples et indépendants, et aucun d'entre eux ne compterait à peine comme un algorithme / une structure de données non triviale (cependant, les analyseurs de combinateurs eux-mêmes le seraient peut-être). Au contraire, le combinateur Y est un algorithme hautement non trivial pour trouver un point fixe, et les listes de différences sont une structure de données intelligente construite entièrement à partir de fonctions d'ordre supérieur. (Je ne sape pas votre réponse, j'essaie juste de clarifier ma question)
jkff

13

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 .


Et cela s’applique tout naturellement aux objets mathématiques calculables en général: autres nombres calculables (pas nécessairement réels), éléments calculables de groupes infinis (anneaux, algèbres, ...), points calculables dans les espaces, etc. Dans tous ces cas, le la théorie concerne l'extraction d'informations de la représentation fonctionnelle (de la manière de calculer l'objet mathématique) et non de l'objet lui-même.
ex0du5

13

Un module de continuité fonctionnelle est une carte mqui accepte un (continu) fonctionnel F : (nat -> nat) -> natet délivre en sortie un nombre de ktelle sorte que F f = F gchaque fois f i = g ipour toutes i < 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.


9

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.

C:0,1n0,1mUNE (α,L,ε)CnUNEM1,,ML

w0,1m,PrUNE[m, (UNEg(C(m),w)α je[L], j[n], PrMje[Mje(j)=mj]1-ε)]2/3

UNEgUNE2/3εmmα


5

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 icomme ceci:

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))

neighborsest une fonction qui renvoie l'ensemble des sommets voisins au sommet donné.

Par exemple, le réseau carré 2D:

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

D'autres algorithmes intéressants dans ce contexte incluent les statistiques d'anneaux de chemins les plus courts de Franzblau.


Cela m'amène à une question que j'avais une fois. S'il existe des méthodes programmatiques pour définir les graphes de cette manière, existe-t-il un moyen de définir un graphe paradoxal auto-référentiel?
Suresh Venkat

1
{X:XX}{X:XX}

Sûr. Mais est-ce un graphe autoréférentiel ?
Suresh Venkat

@Suresh: Il s'agit d'un graphe défini dans un langage fonctionnel en ce sens qu'il existe un type Ude sommets et une fonction U -> U -> Boold'arêtes.
sdcvvc
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.