如果我在ls
scala.collection.immutable.List
的实例中有以下内容:
将ls.init
复制ls
的前n-1个元素然后
给这个副本返回,从而产生n-1的θ运行时(因为复制运行时)?
ls.tail
是否采用O(1)(我想这会将ls
解构为head :: tail
,然后返回tail
,如果它是a,则需要O {1}单链表)?
我实际上需要一个可以给我O(1)init操作的集合,是否有一个为init提供这样的运行时间?
答案 0 :(得分:1)
关于tail
:
@SerialVersionUID(509929039250432923L) // value computed by serialver for 2.11.2, annotation added in 2.11.4
final case class ::[B](override val head: B, private[scala] var tl: List[B]) extends List[B] {
override def tail : List[B] = tl
override def isEmpty: Boolean = false
}
是的,这是O(1)。 Init
中定义了def init: Repr = {
if (isEmpty) throw new UnsupportedOperationException("empty.init")
var lst = head
var follow = false
val b = newBuilder
b.sizeHint(this, -1)
for (x <- this) {
if (follow) b += lst
else follow = true
lst = x
}
b.result
}
:
Vector
所以它是线性的。
如果你需要使用常量init的不可变结构,那么@ {Dima提到dropRight(1)
。 Init在那里实现为print "The following are y/n questions."
total = 0
q1 = raw_input("Do you exercise daily? ")
if q1 == "y":
total += 1
else:
total = total
print total
。但它“有效地保持不变”,因为Vector更像是一个深层数组(Trie of 32),所以dropRight实际上是用另一个大小创建一个新视图(通过快速复制到某个高级别),但仍然需要处理正确的以聪明的方式边缘,所以这个“1”实际上可能是32,甚至是64(我猜)。