Scheme 加入2个列表的最快方式?

Scheme 加入2个列表的最快方式?,scheme,racket,Scheme,Racket,我正在制作一个程序,在一个非常特殊的部分,我需要加入两个对象列表。我一直用append做这样的事情,但我读到append并没有那么快。我需要加入的这两个列表最终会增长。因此,我正在寻找最快的方式为计算机做到这一点 我应该用吗 (append list1 list2) 或者更好: (foldr cons list1 list2) 我不介意元素的顺序。对于长度相等的列表,这应该稍微快一点: (foldl cons list1 list2) 为什么??因为它在list1的开头从list2开始co

我正在制作一个程序,在一个非常特殊的部分,我需要加入两个对象列表。我一直用append做这样的事情,但我读到append并没有那么快。我需要加入的这两个列表最终会增长。因此,我正在寻找最快的方式为计算机做到这一点

我应该用吗

(append list1 list2)
或者更好:

(foldr cons list1 list2)

我不介意元素的顺序。

对于长度相等的列表,这应该稍微快一点:

(foldl cons list1 list2)
为什么??因为它在
list1
的开头从
list2
开始
cons
元素,而
append
将首先
cons
列表1的所有元素,然后在
cons
列表2的末尾,注意我使用的是
foldl
,而不是
foldr
。这将有在常量空间中运行的好处(因为尾部递归)


换句话说:
foldl
解决方案在常量空间中运行,是
O(长度列表2)
,而
append
解决方案是
O(长度列表1)
且不在常量空间中运行,请记住,如果列表的长度不同。

append
不是O(长度总和)。它是O(长度之和,但最后一个列表),因为它共享结构。可能发生的情况是,
foldr
append
不是尾部递归模cons,在这种情况下,使用
foldl
将使用常量堆栈,但在其他情况下,大O是相同的。
(foldl cons x y)
(append reverse y x)
相同。我希望后者的名称更直观。:-)那么,如果大O是相同的……我使用哪一个无关紧要?@DavidMerinos
foldl
将使用更少的空间。虽然大O是相同的,但是
O(n)
中的
n
取决于您选择的选项,如上一段所述。