算法复杂度被设计为与较低级别的细节无关,但是它基于命令式模型,例如,数组访问和修改树中的节点需要O(1)时间。在纯功能语言中不是这种情况。Haskell列表需要线性时间才能访问。修改树中的节点需要制作树的新副本。
那么功能语言是否应该有替代的算法复杂性建模?
ST
monad)在O(1)时间内进行数组访问和修改树节点。
算法复杂度被设计为与较低级别的细节无关,但是它基于命令式模型,例如,数组访问和修改树中的节点需要O(1)时间。在纯功能语言中不是这种情况。Haskell列表需要线性时间才能访问。修改树中的节点需要制作树的新副本。
那么功能语言是否应该有替代的算法复杂性建模?
ST
monad)在O(1)时间内进行数组访问和修改树节点。
Answers:
如果假设演算的函数式编程语言一个很好的模式,那么人们可能会想到:在λ演算具有的时间复杂度一个看似简单的概念:仅计算数量β -还原步骤(λ X 。中号)N → M [ N / x ]。
但这是一个很好的复杂性度量吗?
为了回答这个问题,我们首先要弄清复杂性度量的含义。Slot和van Emde Boas的论点给出了一个很好的答案:任何好的复杂性度量都应该与使用Turing机定义的时间复杂性的规范概念具有多项式关系。换句话说,应该有一个从λ微积分项到Turing机的“合理”编码,例如对于某些多项式p,情况是每个项M的大小| M | :M减少为p (| M |当 t r (M )减小到图灵机的 p (| t r (M )|)步长的值时, β-减小步长正好。
长期以来,尚不清楚是否可以在λ微积分中实现。主要问题如下。
论文“ 测试版减少是不变的,实际上 ”由B. Accattoli和U.德尔拉戈通过展示一个“合理”的编码澄清了问题,可以保留复杂类P的多项式时间的函数,假设最左边最靠外的call-by-名减少。关键的见解是,指数级的爆炸只能出于“无趣”的原因而发生,而这些原因可以通过适当的共享来克服。换句话说,无论您是通过图灵机步数还是(从最左到外)定义类P,类P都是相同的简来。
我不确定其他评估策略的情况。我不知道针对空间复杂性已经执行了类似的程序。
算法复杂度被设计为与较低级别的细节无关。
不,不是。我们总是在某些机器模型中计算基本操作:
因此,您的问题有一个简单的答案:修复机器模型以及要计算的“操作”。这将给您一个措施。如果您希望结果能够与非功能算法相媲美,则最好将程序编译为RAM(用于算法分析)或TM(用于复杂性理论),然后分析结果。可能存在传递定理以简化此过程。
O(1)
确实存在O(log ab)
您可以将成本纳入语言定义本身中,而不用根据某些底层抽象机来制定复杂性度量,这称为“ 成本动态”。一个人以一种构成方式将一种成本附加到该语言的每条评估规则上,也就是说,一项操作的成本是其子表达式的成本的函数。这种方法对于函数式语言来说是最自然的方法,但是它可以用于任何定义良好的编程语言(当然,大多数编程语言并不是定义明确的)。