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 δ
No entanto, e se tivermos um algoritmo que primeiro "encontre um algoritmo mais eficiente para calcular " e depois calcule ?
Em outras palavras, e se tivermos um algoritmo que faça o seguinte:
Encontre um algoritmo eficiente para calcular .
use para calcular .
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.
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.
fonte
Respostas:
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.
fonte
Suponha que temos uma função
f
que aceita um argumentox
do tipoA
e gera outra função que aceita um argumentoy
do tipoB
e retorna um resultado do tipoC
. Em suas palavras,f
pega um argumentox
e retorna um "algoritmo" que recebe entradas do tipoB
e gera resultados do tipoC
.A função
f
tem o tipoDe fato, é preciso
x : A
e retorna uma função do tipoB → C
. Mas talf
é equivalente a uma funçãog : A × B → C
que pega ao mesmo tempox
ey
ao mesmo tempo e fornece o resultado final. De fato, existe um isomorfismo entre os tipose
porque podemos definir
g
em termos def
comoe podemos definir
f
em termos deg
comoA operação de passar de
g
paraf
é 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.
fonte