Scala中的结构共享列表

时间:2017-05-17 19:57:13

标签: scala structure sharing data-sharing

我有一个关于Scala中List的结构共享的问题。我在互联网上读了一些这句话

  

List实现尾部列表的结构共享。这意味着许多操作都是零内存或恒定内存成本。

但我真的不明白如何减少列表操作的时间和内存成本。例如

val mainList = List(3, 2, 1)
val with4 =    4 :: mainList // O(1)

如果我们想用4次创建另一个列表只是O(1)而内存成本为1,但对于列表的操作它会有什么不同?我的意思是长度()或反向()...它仍然是正常的O(n)?任何人都可以解释我,如果你可以一个例子将是非常有帮助的。谢谢!

1 个答案:

答案 0 :(得分:2)

由于结构共享而在常量时间(O(1))中运行的列表上的操作是前置(::),前导和尾部。大多数其他操作是线性时间(O(n))。

您的示例是正确的4 :: myList是常量时间,myList.headmylist.tail也是如此,lengthreverse等其他内容是线性时间。

这就是为什么List在大多数情况下不是特别好用的集合,除非你只使用那些操作,因为其他一切都是O(n)。

您可以参考http://docs.scala-lang.org/overviews/collections/performance-characteristics.html以获取不同集合的运行时特征的概述。