我正在制作一个程序,在一个非常具体的部分我需要加入2个对象列表。我总是习惯附加做这些事情,但我读过它并不是那么快。我需要加入的这两个列表最终会增长。所以我正在寻找计算机的最快方式。
我应该使用
(append list1 list2)
或更好:
(foldr cons list1 list2)
我认为我不介意元素的顺序。
答案 0 :(得分:3)
对于相等长度的列表,这应该稍快一些:
(foldl cons list1 list2)
为什么呢?因为它在cons
的 head 处开始list2
来自list1
的元素,而append
将首先cons
所有元素最后list1
cons
之前的list2
- 并注意到我使用的是foldl
,而不是foldr
。这将具有在恒定空间中运行的好处(因为尾递归)。
换句话说:foldl
解决方案在常量空间中运行且为O(length-of-list2)
,而append
解决方案为O(length-of-list1)
并且不在恒定空间中运行,如果列表有不同的长度,请记住这一点。