¿Existe un concepto para un algoritmo que computa una función al encontrar primero otro algoritmo?

14

Si lo entiendo correctamente, un algoritmo que calcula el valor de una función real tiene una complejidad computacional si se cumple lo siguiente: Cuando calculamos con precisión requiere del orden de pasos .fO(g(n))fδg(n)

Sin embargo, ¿qué sucede si tenemos un algoritmo que primero "encuentra un algoritmo más eficiente para calcular " y luego calcula ?ff

En otras palabras, ¿qué pasa si tenemos un algoritmo que hace lo siguiente:A

  1. Encuentre un algoritmo eficiente para calcular .Bf

  2. use para calcular .Bf

En ese caso, ya no se puede hablar de la tiempo de cálculo que se necesitaría para calcular por ejemplo, debido a que depende totalmente de si el algoritmo ya ha encontrado algoritmo . En otras palabras, el tiempo de cálculo requerido para calcular si 5 es el primer número compilado es mucho mayor que el tiempo de cálculo requerido para calcular f (5) después de que f (3) ya está calculado.f(5)ABf(5)5f(5)f(3)

Mi pregunta es, ¿hay un concepto / teoría sobre este tipo de algoritmo que primero encuentre otro algoritmo antes de calcular una función? Específicamente me pregunto sobre el análisis de la complejidad computacional de tales algoritmos.

usuario56834
fuente
1
¿Dirías que Mathematica hace básicamente lo que estás pidiendo? Le das ecuaciones para resolver y automáticamente determina qué algoritmo usar para resolver esas ecuaciones, luego las resuelve.
user541686
Echa un vistazo a itu.dk/people/sestoft/pebook , es relevante.
Nathan Ringo

Respuestas:

18

Existe un algoritmo bien conocido, el algoritmo de búsqueda universal de Levin, cuyo modo de operación es idéntico. Considere, por ejemplo, el problema de encontrar una asignación satisfactoria para una fórmula que garantice su satisfacción. La búsqueda universal de Levin ejecuta todos los algoritmos potenciales en paralelo, y si algún algoritmo genera una asignación satisfactoria, se detiene y genera esta asignación. Si el algoritmo óptimo para el problema se ejecuta en el tiempo , entonces el algoritmo de Levin se ejecuta en el tiempo O ( f ( n ) ) (con una constante posiblemente enorme) si se implementa correctamente.f(n)O(f(n))

Si bien el algoritmo de Levin no es práctico (debido a las enormes constantes involucradas), en teoría es muy interesante. Consulte el artículo de Scholarpedia para obtener más información sobre la búsqueda universal.

Yuval Filmus
fuente
10

Supongamos que tenemos una función fque toma un argumento xde tipo Ay genera otra función que toma un argumento yde tipo By devuelve un resultado de tipo C. En sus palabras, ftoma un argumento xy devuelve un "algoritmo" que toma entradas de tipo By produce resultados de tipo C.

La función ftiene el tipo

A → (B → C)

De hecho, toma x : Ay devuelve una función de tipo B → C. Pero tal fes equivalente a una función g : A × B → Cque toma ambas x y ya la vez y le da el resultado final. De hecho, hay un isomorfismo entre los tipos

A → (B → C)

y

A × B → C

porque podemos definir gen términos de fcomo

g(x, y) := f(x)(y)

y podemos definir fen términos de gcomo

f(x) := (y ↦ g(x,y))

La operación de pasar de ga fse llama curry y los programadores funcionales lo usan todo el tiempo. En la teoría de la computabilidad, la idea de tomar una entrada y generar una función (algoritmo) está incorporada en el teorema smn .

La respuesta a su pregunta es "sí, la gente hace esto todo el tiempo". Pero también hay una moraleja: un algoritmo que encuentra un algoritmo sigue siendo solo un algoritmo.

Andrej Bauer
fuente
1
+1 para esa oración final. Bien dicho.
John Coleman
f(5)c+ccf(5)f(5)c1+c2c1c2c1>c2
@ Programmer2134 ¿las optimizaciones del compilador serían el concepto que le interesa? No estoy seguro de la teoría detrás de esto (especialmente sus interacciones con la teoría de la complejidad), pero esto podría ser un ejemplo potencial
Mark
La palabra de moda que debe buscarse es "evaluación parcial".
Andrej Bauer el