繁体   English   中英

计算由fx =(x,x)完成的工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM