scala中切片的时间复杂度是多少?

时间:2014-11-07 13:33:41

标签: scala

scala切片方法的时间复杂度是多少?是O(m)还是O(n), 其中m是切片中元素的数量,n是集合中元素的数量。

更具体的问题:什么是时间复杂度 someMap.slice(i, i + 1).keys.head,其中i是random int而不是someMap.size?如果切片复杂度为O(m),那么它应为O(1),对吧?

1 个答案:

答案 0 :(得分:4)

这显然取决于基础数据类型。如果您正在切片{{1},则ArrayArrayBufferByteBuffer或任何其他IndexedSeqOptimized子类的切片为O(k) k来自容器的元素。例如,List O(n)可以通过其implementation看到。您可能希望检查特定类型的来源。

MapIterableLike获取切片的实现。从下面粘贴的实现中,明确了迭代集合中元素的成本加上创建新构建映射的成本。

对于TreeMap,如果您要将O(n + k lg k)个元素从地图中切片,则应为k

对于HashMap,这应受O(n)限制。

override /*TraversableLike*/ def slice(from: Int, until: Int): Repr = {
  val lo = math.max(from, 0)
  val elems = until - lo
  val b = newBuilder
  if (elems <= 0) b.result()
  else {
    b.sizeHintBounded(elems, this)
    var i = 0
    val it = iterator drop lo
    while (i < elems && it.hasNext) {
      b += it.next
      i += 1
    }
    b.result()
  }
}

如有疑问,请查看来源。