作为对this question的跟踪,我试图了解如何不使用{{1将元素 s 添加到list
}}。
来自this的答案:
再次,如果您只想将单个元素添加到列表,即 没问题。 如果您要附加n个元素,这是一个问题 列表的方式,因此,如果您每次都将单个元素附加到 列表,然后执行n次,则算法将为O(n2)。
因此,据我所知,这意味着您不应该这样做:
++
这是引用的答案中的粗体告诉您不要做什么吗?如果没有,使用代码,粗体字警告您不要做什么?
答案 0 :(得分:1)
答案涉及到将元素附加到列表的 end 时的时间复杂度很差。当使用xs
合并长度为 m 的列表ys
和长度为 n 的列表(++)
时,{{1} }的时间复杂度为 O(m)(在您假设xs ++ ys
按照与 m 成比例的多个步骤中进行评估的假设)。
因此,如果您的列表xs ++ ys
由单个元素ys
(即y
)组成,则ys == [y]
将为 O(1)因为您将其添加到另一个列表的末尾,所以[y] ++ xs
将是 O(m)。因此,当您将元素重复添加到另一个列表的末尾时,您将得到 O(m ^ 2)。因此,最好一口气做一下,这样您就会得到 O(m)。
请注意,Haskell中的列表实际上是堆栈,可以具有无限数量的元素。
答案 1 :(得分:0)
尝试使用两个较大的列表(例如[1..10000]),看看是否有任何区别:
func1 a [] = a
func1 a (x:rest) = func (a ++ [x]) rest
func2 a b = a ++ b