试图了解如何不向列表中添加元素

时间:2018-11-18 15:43:27

标签: list haskell

作为对this question的跟踪,我试图了解如何使用{{1将元素 s 添加到list }}。

来自this的答案:

  

再次,如果您只想将单个元素添加到列表,即   没问题。 如果您要附加n个元素,这是一个问题   列表的方式,因此,如果您每次都将单个元素附加到   列表,然后执行n次,则算法将为O(n2)

因此,据我所知,这意味着您不应该这样做:

++

这是引用的答案中的粗体告诉您不要做什么吗?如果没有,使用代码,粗体字警告您不要做什么?

2 个答案:

答案 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