foldlがfoldrよりも遅いのはなぜですか? は、私はそれが正常に動作します(時間計算量はO(N)である)「」 foldl with(++)はfoldrよりもかなり遅い
a = [[1],[2],[3]]
のようなリストのリストを持っていると
foldr (++) [] a
倍使用して、リストにそれを変更したいです。しかし、代わりに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 *は、どちらの場合も同じであるはずです。しかし、計算の数は同じではありません。 –
(大きいリスト)++(小さいリスト)は(小さいリスト)++(大きいリスト)より遅い – immibis
私はあなたが長い間ここにいるのを見て、それを受け入れることなくたくさんの質問をしました。回答が役立つ場合は、[accepting](https:// stackoverflow。com/help/accepted-answer)です。このサイトの仕組みを理解するために[ツアー](https://stackoverflow.com/tour)を2分間過ごしてください。 –