scala切片方法的时间复杂度是多少?是O(m)
还是O(n)
,
其中m是切片中元素的数量,n是集合中元素的数量。
更具体的问题:什么是时间复杂度
someMap.slice(i, i + 1).keys.head
,其中i是random int而不是someMap.size?如果切片复杂度为O(m)
,那么它应为O(1)
,对吧?
答案 0 :(得分:4)
这显然取决于基础数据类型。如果您正在切片{{1},则Array
,ArrayBuffer
,ByteBuffer
或任何其他IndexedSeqOptimized
子类的切片为O(k)
k
来自容器的元素。例如,List
O(n)
可以通过其implementation看到。您可能希望检查特定类型的来源。
Map
从IterableLike
获取切片的实现。从下面粘贴的实现中,明确了迭代集合中元素的成本加上创建新构建映射的成本。
对于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()
}
}
如有疑问,请查看来源。