如何为功能语言建模算法复杂度?


38

算法复杂度被设计为与较低级别的细节无关,但是它基于命令式模型,例如,数组访问和修改树中的节点需要O(1)时间。在纯功能语言中不是这种情况。Haskell列表需要线性时间才能访问。修改树中的节点需要制作树的新副本。

那么功能语言是否应该有替代的算法复杂性建模?


3
可能是您要寻找的。
阿里斯都

1
您的问题可以在这里回答:cs.stackexchange.com/q/18262/755。特别地,对于两种语言的功能的一些适当假设,纯功能语言的时间复杂度与命令式语言的时间复杂度最多为的比率。Ø日志ñ
DW

3
GHC Haskell支持可变数组和树等,它允许您使用“状态线程”(STmonad)在O(1)时间内进行数组访问和修改树节点。
Tanner Swett

1
@BobJarvis取决于。列表是您的抽象数据类型,还是您专门考虑链接列表?
拉斐尔

1
您寻求建模算法复杂性的目的是什么?您是在寻找数学上纯净的东西,还是实用的东西?为了获得实用价值,它应该注意诸如是否有可用的记忆之类的事情,但是从数学纯粹主义者的角度来看,实现的功能应该无关紧要。
Cort Ammon

Answers:


34

如果假设演算的函数式编程语言一个很好的模式,那么人们可能会想到:在λ演算具有的时间复杂度一个看似简单的概念:仅计算数量β -还原步骤λ X 中号N M [ N / x ]λλβ(λx.M)NM[N/x]

但这是一个很好的复杂性度量吗?

为了回答这个问题,我们首先要弄清复杂性度量的含义。Slot和van Emde Boas的论点给出了一个很好的答案:任何好的复杂性度量都应该与使用Turing机定义的时间复杂性的规范概念具有多项式关系。换句话说,应该有一个从λ微积分项到Turing机的“合理”编码,例如对于某些多项式p,情况是每个项M的大小| M | M减少为p | M |tr(.)λpM|M|M t r M 减小到图灵机的 p | t r M |步长的值时, β-减小步长正好。p(|M|) βtr(M)p(|tr(M)|

长期以来,尚不清楚是否可以在λ微积分中实现。主要问题如下。

  • 有一些项可以产生指数大小的范式(以多项式为步长)。即使写下标准格式也要花费指数时间。
  • 选择的减少策略起着重要作用。例如,存在一系列项,这些项减少了并行β步的多项式数量(从最佳λ减少的意义上讲),但是其复杂度是非基本的(意味着差于指数)。

论文“ 测试版减少是不变的,实际上 ”由B. Accattoli和U.德尔拉戈通过展示一个“合理”的编码澄清了问题,可以保留复杂类P的多项式时间的函数,假设最左边最靠外的call-by-名减少。关键的见解是,指数级的爆炸只能出于“无趣”的原因而发生,而这些原因可以通过适当的共享来克服。换句话说,无论您是通过图灵机步数还是(从最左到外)定义类P,类P都是相同的简来。β

我不确定其他评估策略的情况。我不知道针对空间复杂性已经执行了类似的程序。


23

算法复杂度被设计为与较低级别的细节无关。

不,不是。我们总是在某些机器模型中计算基本操作:

  • 图灵机的步骤。
  • RAM的基本操作。

ΩΘØΘ

因此,您的问题有一个简单的答案:修复机器模型以及要计算的“操作”。这将给您一个措施。如果您希望结果能够与非功能算法相媲美,则最好将程序编译为RAM(用于算法分析)或TM(用于复杂性理论),然后分析结果。可能存在传递定理以简化此过程。


同意 附注:人们经常会犯很多错误的什么操作“不变”。例如,假设a + b O(1)确实存在O(log ab)
Paul Draper

3
@PaulDraper这是一个不同的假设,不一定是错误的。我们可以对所需模型进行建模-问题是它是否回答了有趣的问题。另请参阅此处
拉斐尔

听起来很像“摆脱机器模型”
Paul Draper

@PaulDraper取决于您对“机器”一词有什么样的情感。另请参阅此讨论。FWIW,单价RAM模型-可以说是算法分析中的标准模型!- 有用的,否则将不被使用了几十年了。排序,搜索树等的所有熟悉范围都基于该模型。这是有道理的,因为只要数字适合寄存器,它就可以很好地模拟真实计算机。
拉斐尔

1

您可以将成本纳入语言定义本身中,而不用根据某些底层抽象机来制定复杂性度量,这称为“ 成本动态”。一个人以一种构成方式将一种成本附加到该语言的每条评估规则上,也就是说,一项操作的成本是其子表达式的成本的函数。这种方法对于函数式语言来说是最自然的方法,但是它可以用于任何定义良好的编程语言(当然,大多数编程语言并不是定义明确的)。


<关于删除什么机器模型的讨论。>让我们在chat中继续进行此讨论
拉斐尔
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.