通过首先找到另一个算法来计算功能的算法是否存在概念?


14

如果我正确理解的话,如果满足以下条件,则计算实函数的值的算法将具有计算复杂度O g n :当我们计算f到精度δ时,需要g n 步的数量级。fO(g(n))fδg(n)

但是,如果我们有一个算法“首先找到一个更有效的算法来计算 ”,然后再计算f会怎样?ff

换句话说,如果我们有一个算法执行以下操作,该怎么办:A

  1. 找到一个有效的算法计算˚FBf

  2. 计算fBf

在这种情况下,我们可以不再说话的计算时间则需计算例如,因为它完全依赖于算法是否一个已经找到算法。换句话说,需要计算的计算时间˚F 5 如果5是第一comoputed数目远远大于所需的计算的计算时间更大˚F 5 ˚F 3 是已经计算。f(5)ABf(5)5f(5)f(3)

我的问题是,关于这种算法的概念/理论是否在计算函数之前先找到另一种算法?具体而言,我想知道有关此类算法的计算复杂性的分析。


1
您会说Mathematica基本上是您要问的吗?您给它提供方程式来求解,它会自动找出用于求解这些方程式的算法,然后求解它们。
user541686 '17

查看itu.dk/people/sestoft/pebook,这是相关的。
内森·林戈

Answers:


18

有一个著名的算法,莱文的通用搜索算法,其操作模式是相同的。例如考虑为保证可以满足的公式找到令人满意的分配的问题。Levin的通用搜索并行运行所有潜在算法,如果有算法输出令人满意的分配,则停止并输出该分配。如果针对该问题的最佳算法在时间运行,那么莱文算法在时间O f n (具有可能很大的常数)下运行(如果正确实现)。f(n)O(f(n))

尽管Levin的算法不切实际(由于涉及巨大的常数),但从理论上讲它非常有趣。有关通用搜索的更多信息,请参见Scholarpedia文章


10

假设我们有一个f接受x类型为参数的A函数,并输出另一个接受y类型为参数B并返回结果类型的函数C。用您的话说,f接受一个参数x并返回一个“算法”,该算法接受type的输入B并输出type的结果C

功能f有类型

A → (B → C)

实际上,它接受x : A并返回type函数B → C。但这样的f相当于一个函数g : A × B → C这需要双方 xy在一次给你的最终结果。确实,类型之间存在同构

A → (B → C)

A × B → C

因为我们可以定义g来讲f

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

我们可以定义f来讲g

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

g到传递的操作f称为currying,函数式程序员一直在使用它。在可计算性理论中,将一个输入和输出一个函数(算法)的想法体现在smn定理中

您的问题的答案是“是的,人们一直在这样做”。但是,还有一个道理:找到一个算法的算法仍然只是一个算法。


1
该最后一句话+1。说得好。
约翰·科尔曼

f(5)c+ccf(5)f(5)c1+c2c1c2c1>c2

@ Programmer2134编译器优化是您感兴趣的概念吗?我完全不确定这个背后的理论(尤其是它与复杂性理论的相互作用),但这可能是一个潜在的例子
马克

要寻找的流行词是“部分评估”。
安德烈·鲍尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.