列表运行时尾部和init

时间:2016-01-11 14:58:17

标签: scala scala-collections

如果我在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提供这样的运行时间?

1 个答案:

答案 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(我猜)。