La mayoría de los algoritmos conocidos son de primer orden, en el sentido de que su entrada y salida son datos "simples". Algunos son de segundo orden de una manera trivial, por ejemplo, la clasificación, las tablas hash o las funciones de mapa y plegado: están parametrizados por una función, pero en realidad no hacen nada interesante excepto invocarlo en otros datos de entrada.
Algunos también son de segundo orden pero algo más interesantes:
- Yemas de los dedos parametrizadas por monoides
- Dividir un dedo en un predicado monótono
- Algoritmos de suma de prefijos, nuevamente parametrizados por un monoide o un predicado, etc.
Finalmente, algunos son "verdaderamente" de orden superior en el sentido que es más interesante para mí:
- El combinador Y
- Listas de diferencias
¿Existen otros algoritmos no triviales de orden superior?
En un intento por aclarar mi pregunta, bajo "orden superior no trivial" me refiero a "usar facilidades de orden superior del formalismo computacional de manera crítica en la interfaz y / o implementación del algoritmo"
Respuestas:
Hay muchas funciones de orden superior en http://math.andrej.com/ , por ejemplo, en la publicación sobre exponenciales dobles , aparece el siguiente tipo de Haskell (con los sinónimos de tipo expandidos):
También puede divertirse mucho con la publicación A Haskell Monad for Infinite Search in Finite Time , por ejemplo:
¡Supongo que el tipo de bigUnion es de 4to o 5to orden!
fuente
hay un montón de algoritmos que son "realmente de segundo orden" aunque generalmente no se describen explícitamente en estos términos. Siempre que tenemos algoritmos de tiempo sub-lineales, implícito es algún tipo de acceso oráculo a la entrada, es decir, realmente trata la entrada como una función.
Ejemplos:
(1) Los algoritmos elipsoides cuando se trabaja con un "oráculo de separación" (por ejemplo, http://math.mit.edu/~vempala/18.433/L18.pdf )
(2) Minimización de la función submodular (por ejemplo, http://people.commerce.ubc.ca/faculty/mccormick/sfmchap8a.pdf )
(3) Todo el campo de las pruebas de propiedad es realmente de esta forma ( http://www.wisdom.weizmann.ac.il/~oded/test.html )
(4) Subastas combinadas en el modelo de consulta (por ejemplo, http://pluto.huji.ac.il/~blumrosen/papers/iter.pdf )
fuente
Hay otra respuesta a esta pregunta: no hay ninguna. Más específicamente, cualquier algoritmo de orden superior de este tipo (¡implementable!) Es mecánicamente equivalente a un algoritmo de primer orden, que utiliza la desfuncionalización .
Permítanme ser más preciso: si bien existen algoritmos reales de orden superior, en la práctica siempre es posible reescribir cada instancia como un programa puramente de primer orden. En otras palabras, no hay programas saturados de orden superior, esencialmente porque la entrada / salida de los programas son cadenas de bits. [Sí, esas cadenas de bits pueden representar funciones, pero ese es el punto: que representan funciones, que son no funciona].
Las respuestas ya dadas son excelentes, y mi respuesta no debe considerarse como una contradicción. Debe considerarse como una respuesta a la pregunta desde un contexto un poco más amplio (programas completos en lugar de algoritmos independientes). Y este cambio de contexto cambia la respuesta de manera radical. El punto de mi respuesta es recordarle a la gente esto, que es demasiado fácil de olvidar.
fuente
(\\() -> "Ceci n'est pas une fonction") ()
En las bibliotecas de combinador de analizador, el orden de la función es generalmente bastante alto. Echa un vistazo a las funciones de orden aún más alto para analizar o ¿Por qué alguien querría usar una función de sexto orden? por Chris Okasaki. Journal of Functional Programming , 8 (2): 195-199, marzo de 1998.
fuente
El análisis computable caracteriza los números reales mediante programación, ya que los números reales contienen una cantidad ilimitada de información, por lo que las operaciones con números reales son de orden superior en el sentido de las preguntas. Por lo general, los números reales se presentan utilizando una vista topológica en el flujo infinito de bits, el espacio de Cantor, lo que presta interés al campo más amplio de la topología computable.
Klaus Weihrach ha hablado de esto como la Jerarquía de efectividad de tipo dos de la topología computable. Para obtener más información al respecto, consulte Weihrach & Grubba, 2009, Topología computable elemental , y la página de investigación de John Tucker, Computación con datos topológicos . Menciono la página de Tucker en mi pregunta, Aplicaciones de Cantor Space .
fuente
Un módulo de continuidad funcional es un mapa
m
que acepta un funcional (continuo)F : (nat -> nat) -> nat
y genera un númerok
tal queF f = F g
siempre que seaf i = g i
para todosi < k
. Existen algoritmos para calcular el módulo de continuidad (no muy eficientes), lo que lo convierte en una instancia de un algoritmo de tercer orden.fuente
Para complementar la respuesta de Noam , también hay varias situaciones en las que es importante que la salida sea (una representación explícita de) una función.
Un ejemplo interesante es la definición de un código decodificable por lista. Deje que sea un código. Decimos que un algoritmo probabilístico lista-decodifica si en la entrada , genera máquinas probabilísticas manera que:C:0,1n→0,1m A (α,L,ϵ) C n A M1,…,ML
Aquí, denota la fracción de coordenadas con las que las dos cadenas están de acuerdo. En otras palabras, para cada palabra recibida, la salida de debe contener, con una probabilidad de al menos , una máquina que aproxima a para cada mensaje cuya codificación concuerda con al menos fracción de las coordenadas de la palabra recibidaA 2 / 3 ε m m αAg A 2/3 ϵ m m α
fuente
En los algoritmos gráficos, los vértices y los bordes generalmente se consideran datos simples, pero en realidad pueden generalizarse productivamente para que se generen mediante programación a pedido.
Durante mi doctorado (en química computacional) implementé muchos algoritmos gráficos en forma de orden superior para aplicarlos al análisis de gráficos implícitos, principalmente porque mis gráficos reales eran infinitos, ¡así que no podía permitirme almacenarlos explícitamente! Específicamente, estaba estudiando la topología de materiales amorfos representados como inclinaciones 3D de células unitarias (supercélulas).
Por ejemplo, puede escribir una función para calcular el enésimo vecino más cercano de un vértice de origen
i
como este:donde
neighbors
es una función que devuelve el conjunto de vértices vecinos al vértice dado.Por ejemplo, la red cuadrada 2D:
Otros algoritmos interesantes en este contexto incluyen las estadísticas de anillos de ruta más cortos de Franzblau.
fuente
U
de vértices y una funciónU -> U -> Bool
de bordes.