爲什麼foldl有時比foldr慢? 我有一個列表的列表「一」像foldl with(++)比foldr慢很多
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)
'(++)'的*結果*在兩種情況下應該是相同的。這並不意味着計算的數量是相同的。 –
(大列表)++(小列表)慢於(小列表)++(大列表) – immibis
我看到你在這裏待了很長時間,並且在不接受問題的情況下問了很多問題。如果答案對您有幫助,請考慮[接受](https:// stackoverflow。com/help/accepted-answer)它。請花2分鐘做一個[旅遊](https://stackoverflow.com/tour)瞭解這個網站的工作原理 –