Existe um conceito para um algoritmo que calcula uma função encontrando primeiro outro algoritmo?

14

Se eu entendi direito, um algoritmo que calcula o valor de uma função real tem complexidade computacional se o seguinte for válido: Quando computamos com precisão requer da ordem de etapas .O ( g ( n ) ) f δfO(g(n))fδg(n)

No entanto, e se tivermos um algoritmo que primeiro "encontre um algoritmo mais eficiente para calcular " e depois calcule ?ff

Em outras palavras, e se tivermos um algoritmo que faça o seguinte:A

  1. Encontre um algoritmo eficiente para calcular .Bf

  2. use para calcular .Bf

Nesse caso, já não se pode falar de tempo computacional que seria necessário para computação , por exemplo, porque é totalmente depende se Algorithm já encontrou algoritmo . Em outras palavras, o tempo de computação necessário para calcular se é o primeiro número calculado é muito maior que o tempo computacional necessário para calcular após já ser calculado.f(5)UMABf(5)5f(5)f(3)

Minha pergunta é: existe um conceito / teoria sobre esse tipo de algoritmo que primeiro encontre outro algoritmo antes de calcular uma função? Especificamente, estou me perguntando sobre a análise da complexidade computacional de tais algoritmos.

user56834
fonte
1
Você diria que o Mathematica basicamente faz o que está pedindo? Você fornece equações para resolver e ele automaticamente descobre qual algoritmo usar para resolver essas equações e as resolve.
user541686
Confira itu.dk/people/sestoft/pebook , é relevante.
Nathan Ringo

Respostas:

18

Existe um algoritmo bem conhecido, o algoritmo de busca universal de Levin, cujo modo de operação é idêntico. Considere, por exemplo, o problema de encontrar uma atribuição satisfatória para uma fórmula que é garantida como satisfatória. A pesquisa universal de Levin executa todos os algoritmos em potencial em paralelo e, se algum algoritmo gerar uma tarefa satisfatória, interrompe e gera essa tarefa. Se o algoritmo ideal para o problema for executado no tempo , o algoritmo de Levin será executado no tempo (com uma constante possivelmente enorme) se implementado corretamente.f(n)O(f(n))

Embora o algoritmo de Levin seja impraticável (devido às enormes constantes envolvidas), é muito interessante teoricamente. Veja o artigo da Scholarpedia para mais informações sobre a pesquisa universal.

Yuval Filmus
fonte
10

Suponha que temos uma função fque aceita um argumento xdo tipo Ae gera outra função que aceita um argumento ydo tipo Be retorna um resultado do tipo C. Em suas palavras, fpega um argumento xe retorna um "algoritmo" que recebe entradas do tipo Be gera resultados do tipo C.

A função ftem o tipo

A → (B → C)

De fato, é preciso x : Ae retorna uma função do tipo B → C. Mas tal fé equivalente a uma função g : A × B → Cque pega ao mesmo tempo x e yao mesmo tempo e fornece o resultado final. De fato, existe um isomorfismo entre os tipos

A → (B → C)

e

A × B → C

porque podemos definir gem termos de fcomo

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

e podemos definir fem termos de gcomo

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

A operação de passar de gpara fé chamada de currying e programadores funcionais o usam o tempo todo. Na teoria da computabilidade, a idéia de pegar uma entrada e gerar uma função (algoritmo) é incorporada no teorema smn .

A resposta para sua pergunta é "sim, as pessoas fazem isso o tempo todo". Mas há também uma moral: um algoritmo que encontra um algoritmo ainda é apenas um algoritmo.

Andrej Bauer
fonte
1
+1 para a frase final. Bem dito.
John Coleman
f(5)c+ccf(5)f(5)c1+c2c1c2c1>c2
@ Programmer2134 as otimizações do compilador seriam o conceito em que você está interessado? Tenho certeza da teoria por trás disso em tudo (especialmente suas interações com a teoria da complexidade), mas este poderia ser um exemplo potencial
Mark
A palavra da moda a procurar é "avaliação parcial".
Andrej Bauer 01/01