相关疑难解决方法(0)

在GHC Haskell中何时自动记忆?

我无法弄清楚为什么m1显然被记忆,而m2不在下面:

m1      = ((filter odd [1..]) !!)

m2 n    = ((filter odd [1..]) !! n)
Run Code Online (Sandbox Code Playgroud)

m1 10000000在第一次调用时大约需要1.5秒,而后续调用需要一小部分(大概是缓存列表),而m2 10000000总是花费相同的时间(每次调用重建列表).知道发生了什么事吗?关于GHC是否以及何时会记忆功能,是否有任何经验法则?谢谢.

haskell memoization ghc

106
推荐指数
3
解决办法
9781
查看次数

为什么这个简单的O(n)Haskell算法表现得更像O(2 ^ n)?

Haskell缓存纯函数调用的结果,这是纯粹和不纯行为分离的众多原因之一.但是这个函数应该在O(n)中运行,其中n在50下面,运行得非常慢:

lucas 1 = 1
lucas 2 = 3
lucas n = lucas (n-1) + lucas (n-2)
map (lucas) [1..50]
Run Code Online (Sandbox Code Playgroud)

前三十个左右一起计算在一秒钟内,然后31个需要半秒钟左右,32个需要一秒钟,33个需要几秒钟,34个需要6秒钟,35个需要11秒钟,36个需要17秒钟. .

为什么这个功能这么慢?如果GHC交互式运行时缓存结果,则每次调用lucas应仅涉及前两个缓存术语的求和.一个额外的操作找到术语3,一个额外的添加找到术语4,一个额外的添加找到术语5,所以术语50达到考虑缓存只有48个加法.该功能不应该花费近一秒钟才能找到至少前几千个术语,为什么表现如此可怕?

我现在已经等了半个多小时lucas 500才能计算出来.

algorithm big-o caching haskell time-complexity

6
推荐指数
1
解决办法
192
查看次数

标签 统计

haskell ×2

algorithm ×1

big-o ×1

caching ×1

ghc ×1

memoization ×1

time-complexity ×1