加入 2 个列表的最快方法?
Fastest way to join 2 lists?
我正在制作一个程序,在一个非常具体的部分,我需要加入 2 个对象列表。我一直使用 append 来做这样的事情,但我读过 append 并没有那么快。我需要加入的这两个列表最终会增长。所以我正在寻找计算机最快的方法。
我应该使用
(append list1 list2)
或更好:
(foldr cons list1 list2)
我不介意元素的顺序。
对于等长的列表,这应该稍微快一些:
(foldl cons list1 list2)
为什么?因为它在 list1
的 head 开始 cons
ing 来自 list2
的元素,而 append
将首先 cons
所有在最后 cons
ing list2
之前 list1
的元素 - 请注意我使用的是 foldl
,而不是 foldr
。这将有 运行ning 常量 space 的好处(因为尾递归)。
换句话说:foldl
解 运行 是常量 space 并且是 O(length-of-list2)
而 append
解是 O(length-of-list1)
而不是 运行 常量 space,如果列表的长度不同,请记住这一点。
我正在制作一个程序,在一个非常具体的部分,我需要加入 2 个对象列表。我一直使用 append 来做这样的事情,但我读过 append 并没有那么快。我需要加入的这两个列表最终会增长。所以我正在寻找计算机最快的方法。
我应该使用
(append list1 list2)
或更好:
(foldr cons list1 list2)
我不介意元素的顺序。
对于等长的列表,这应该稍微快一些:
(foldl cons list1 list2)
为什么?因为它在 list1
的 head 开始 cons
ing 来自 list2
的元素,而 append
将首先 cons
所有在最后 cons
ing list2
之前 list1
的元素 - 请注意我使用的是 foldl
,而不是 foldr
。这将有 运行ning 常量 space 的好处(因为尾递归)。
换句话说:foldl
解 运行 是常量 space 并且是 O(length-of-list2)
而 append
解是 O(length-of-list1)
而不是 运行 常量 space,如果列表的长度不同,请记住这一点。