Scheme 加入2个列表的最快方式?
我正在制作一个程序,在一个非常特殊的部分,我需要加入两个对象列表。我一直用append做这样的事情,但我读到append并没有那么快。我需要加入的这两个列表最终会增长。因此,我正在寻找最快的方式为计算机做到这一点 我应该用吗Scheme 加入2个列表的最快方式?,scheme,racket,Scheme,Racket,我正在制作一个程序,在一个非常特殊的部分,我需要加入两个对象列表。我一直用append做这样的事情,但我读到append并没有那么快。我需要加入的这两个列表最终会增长。因此,我正在寻找最快的方式为计算机做到这一点 我应该用吗 (append list1 list2) 或者更好: (foldr cons list1 list2) 我不介意元素的顺序。对于长度相等的列表,这应该稍微快一点: (foldl cons list1 list2) 为什么??因为它在list1的开头从list2开始co
(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是相同的……我使用哪一个无关紧要?@DavidMerinosfoldl
将使用更少的空间。虽然大O是相同的,但是O(n)
中的n
取决于您选择的选项,如上一段所述。