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 .
Sin embargo, ¿qué sucede si tenemos un algoritmo que primero "encuentra un algoritmo más eficiente para calcular " y luego calcula ?
En otras palabras, ¿qué pasa si tenemos un algoritmo que hace lo siguiente:
Encuentre un algoritmo eficiente para calcular .
use para calcular .
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.
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.
fuente
Respuestas:
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.
fuente
Supongamos que tenemos una función
f
que toma un argumentox
de tipoA
y genera otra función que toma un argumentoy
de tipoB
y devuelve un resultado de tipoC
. En sus palabras,f
toma un argumentox
y devuelve un "algoritmo" que toma entradas de tipoB
y produce resultados de tipoC
.La función
f
tiene el tipoDe hecho, toma
x : A
y devuelve una función de tipoB → C
. Pero talf
es equivalente a una funcióng : A × B → C
que toma ambasx
yy
a la vez y le da el resultado final. De hecho, hay un isomorfismo entre los tiposy
porque podemos definir
g
en términos def
comoy podemos definir
f
en términos deg
comoLa operación de pasar de
g
af
se 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.
fuente