이것은 분명히 기본 데이터 형식에 따라 다릅니다. 예를 들어 Array
, ArrayBuffer
, ByteBuffer
또는 IndexedSeqOptimized
의 다른 하위 클래스를 자르는 것은 k
요소를 컨테이너에서 자르는 경우 O(k)
입니다. 예를 들어, List
은 으로 볼 수있는 O(n)
입니다. 특정 유형의 출처를 확인하고 싶을 것입니다.
Map
은 IterableLike
에서 슬라이스 구현을 가져옵니다. 아래에 붙여 넣은 구현에서 컬렉션의 요소를 반복하는 비용과 새로 빌드 한지도를 만드는 데 드는 비용을 분명히 알 수 있습니다.
TreeMap
의 경우 k
개 요소를지도에서 자르는 경우 O(n + k lg 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()
}
}
의심스러운 경우 소스를 확인하십시오.
구현에 따라 다릅니다. 예를 들어, 목록에서 보통 오래된 조회는'O (n)'이므로'O (m) '에서 슬라이스 할 수 없습니다. –
목록에서 슬라이스가 목록의 시작 부분에 가까울 경우 O (n)보다 빠른 O (until) (실제로 O (max (n, until)))가 있습니다. 목록을 얼마나 오래 보관하든 상관하지 않습니다. 그러나 그것은 O (m)가 아닙니다. 이것은 ~까지입니다. 슬라이스의 시작 부분까지 돈을 지불해야합니다. –
@DidierDupont Big-O 표기법은 항상 최악의 경우 분석입니다. 'O (max (n, until))'이라고 말하면'until <= n' 인 경우'O (n)'을 의미합니다. – Nate