[英]Calculating work done by f x = (x,x)
假设我有这个函数:( Haskell语法)
f x = (x,x)
该功能执行的工作(计算量)是多少?
起初我认为它显然是不变的,但是如果x
的类型不是有限的,那意味着x可以占用任意数量的内存? 人们必须考虑到复制x
所做的工作,对吗?
这让我相信函数完成的工作实际上是输入大小的线性。
这不是本身的功课,但是在我必须定义函数完成的工作时出现了:
f x = [x]
我相信哪个有类似的问题。
非正式地,完成的工作取决于您的语言的操作语义。 Haskell,嗯,它很懒,所以你只需支付常数因素:
x
(,)
分配一个堆单元 (,)
应用于其参数 完成。 O(1)工作,当调用者查看f
的结果时执行。
现在,如果您查看(,)
内部,您将触发进一步的评估 - 并且该工作取决于评估x
本身的工作。 因为在Haskell中对x
的引用是共享的,所以只评估它一次。
因此,如果您完全评估结果,Haskell中的工作是O(x的工作) 。 你的函数f
只增加了常数因子。
当一些(或完全)懒惰被引入时,Chris Okasaki有一种很好的方法来确定函数调用的工作量。 我相信这是关于纯功能数据结构的论文。 我知道这是书的版本 - 我上个月读了这本书的那一部分。 基本上你为一个承诺/ thunk创建了一个恒定的因子,没有任何费用来评估任何传递的promises / thunk(假设它们已经被强制/处于正常形式[不仅仅是WHNF])。 这是低估的。 如果你想要高估费用,强制/转换为正常的成本也会形成由函数创建的每个promise / thunk。 至少,这就是我在极度疲惫的状态下记忆的方式。
在Okasaki查找: http : //www.westpoint.edu/eecs/SitePages/Chris%20Okasaki.aspx#thesis - 我发誓所使用的论文可以下载。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.