我今天了解到,算法分析基于计算模型而有所不同。这是我从未想过或从未听说过的事情。
@chi用户给我的示例进一步说明了这一点:
例如,考虑任务:给定 返回 。在RAM中,这可以在解决, 因为数组访问是固定时间的。使用TM,我们需要扫描整个输入,所以它是
这使我对功能语言感到疑惑。从我的理解,“函数式语言是密切相关的演算”(由尤瓦Filmus一个评论对这里)。因此,如果功能语言基于lambda演算,但它们在基于RAM的计算机上运行,那么对使用纯功能数据结构和语言实现的算法进行复杂度分析的正确方法是什么?
我没有机会阅读“ 纯粹的功能数据结构”,但是我浏览了Wikipedia页面上的主题,并且似乎某些数据结构确实用以下方法代替了传统的数组:
“数组可以用映射或随机访问列表替换,这允许使用纯功能实现,但是访问和更新时间是对数的。”
在那种情况下,计算模型会有所不同,对吗?
3
我绝对不是这个主题的专家,但我相信我听说过1)类似Lisp的机器(具有自己的成本模型)可以模拟具有附加因子的RAM程序(这看起来很容易证明),以及2)是否确实需要这个因素仍然是一个未解决的问题。此外,可以说在RAM模型中为阵列访问分配O(1)成本过于慷慨。在硬件中,内存访问必须遍历门,其中是物理内存的大小。
—
志
还请记住,几乎所有现实世界中的FP语言都具有某种形式的数组,并保证了访问时间(如命令式语言一样)。通常可以解决将其添加为语言原语的问题。
—
2016年
不同计算模型的一个示例是在lambda演算项上完成的beta减少次数。在FP我们更因此采用打扮成演算冲压模型,如果是有道理的
—
库尔特·穆勒
@KurtMueller注意,仅减少贝特,就可以得到大小为的拉姆达项。这使得计算贝塔数的成本模型不现实。可以说,更好的方法可能是根据当前术语的大小来权衡每一步。但是,这不是唯一可能的模型:lambda项的最佳评估并不以幼稚的方式应用beta,而是希望使用一些更复杂的图形化约简机。在这种情况下,计算beta可能不合适。
—
2016年
请注意,您还需要知道您的功能语言是急切的还是懒惰的/严格的或非严格的。我最近遇到了这样一种情况:在Haskell(非严格)中,真实世界算法是多项式,但是对OCaml(严格)的天真的转换是指数式的。
—
埃里克·利珀特