Scala TreeSet过滤器的复杂性

时间:2018-01-24 06:16:14

标签: scala data-structures

我有一个TreeSet间隔(开始和结束的案例类)。如果对此树集执行过滤,例如

treeSet.filter(x => input <= x.end && input >= x.start) 

预计会在logN时间内运行吗?

2 个答案:

答案 0 :(得分:4)

不是O(N);你可以看到代码:

private def filterImpl(p: A => Boolean, isFlipped: Boolean): Repr = {
  val b = newBuilder
  for (x <- this)
    if (p(x) != isFlipped) b += x

  b.result
}

使用fromto O(log(n))

val ts = TreeSet(1,2,3,4,5)
ts.from(1).to(3) // TreeSet(1, 2, 3)

答案 1 :(得分:1)

TreeSet的O(LogN)复杂度仅用于搜索操作 Filter需要将谓词函数应用于每个元素,并仅返回谓词函数为true的元素。因此,复杂性是O(N)

当你认为谓词函数可以是任何东西(不仅仅是范围过滤器)时,这是有道理的。

您可以使用TreeSet.fromTreeSet.to方法执行范围过滤器

import scala.collection.immutable.TreeSet
val st = TreeSet[Int](4,2,3,7,6,5,3,4)
println(st)
println(st.from(5))
println(st.from(4).to(6))