我有一个关于Scala中List的结构共享的问题。我在互联网上读了一些这句话
List实现尾部列表的结构共享。这意味着许多操作都是零内存或恒定内存成本。
但我真的不明白如何减少列表操作的时间和内存成本。例如
val mainList = List(3, 2, 1)
val with4 = 4 :: mainList // O(1)
如果我们想用4次创建另一个列表只是O(1)而内存成本为1,但对于列表的操作它会有什么不同?我的意思是长度()或反向()...它仍然是正常的O(n)?任何人都可以解释我,如果你可以一个例子将是非常有帮助的。谢谢!
答案 0 :(得分:2)
由于结构共享而在常量时间(O(1))中运行的列表上的操作是前置(::
),前导和尾部。大多数其他操作是线性时间(O(n))。
您的示例是正确的4 :: myList
是常量时间,myList.head
和mylist.tail
也是如此,length
和reverse
等其他内容是线性时间。
这就是为什么List
在大多数情况下不是特别好用的集合,除非你只使用那些操作,因为其他一切都是O(n)。
您可以参考http://docs.scala-lang.org/overviews/collections/performance-characteristics.html以获取不同集合的运行时特征的概述。