【发布时间】:2016-11-13 12:55:49
【问题描述】:
为什么有时 foldl 比 foldr 慢? 我有一个列表“a”之类的列表
a = [[1],[2],[3]]
并希望通过使用折叠将其更改为列表
foldr (++) [] a
它工作正常(时间复杂度为 O(n))。但是如果我用 foldl 代替,它会很慢(时间复杂度是 O(n^2))。
foldl (++) [] a
如果 foldl 只是从左侧折叠输入列表,
(([] ++ [1]) ++ [2]) ++ [3]
而foldr是从右边开始的,
[1] ++ ([2] ++ ([3] ++ []))
两种情况下的计算次数 (++) 应该相同。为什么 foldr 这么慢?根据时间复杂度,foldl 看起来好像扫描输入列表的次数是 foldr 的两倍。我用下面的来计算时间
length $ fold (++) [] $ map (:[]) [1..N] (fold is either foldl or foldr)
【问题讨论】:
-
(++)的 result 在这两种情况下应该是相同的。但这并不意味着计算次数是相同的。 -
(大列表)++(小列表)比(小列表)++(大列表)慢
-
嗨,我刚做了。对不起,我不知道。 eii
标签: haskell