我有一大堆整数,我正在使用TreeSet来存储。我的任务是找出两个小于输入数字的数字。
例如Set(1,5,8,9)和input = 6应该返回(1,5) input = 8应该返回(5,8)
到目前为止,我在代码方面的内容如下:
treeSet.to(inputNumber).takeRight(2)
我的理解是.to()返回的元素投影少于logN时间内的输入。我想知道额外的takeRight的复杂性是什么。我无法从文档中找到答案。
我正努力使其尽可能高效,因为我的输入列表有数百万个数字。
答案 0 :(得分:1)
有时甚至在查看文档之前就更容易查看源代码。
在TreeSet
:
override def takeRight(n: Int) = drop(size - math.max(n, 0))
override def drop(n: Int) = {
if (n <= 0) this
else if (n >= size) empty
else newSet(RB.drop(tree, n))
}
在RedBlackTree
:
def drop[A: Ordering, B](tree: Tree[A, B], n: Int): Tree[A, B] = blacken(doDrop(tree, n))
RBtree中的删除为O(log n)
,因此由RBtree支持的Scala takeRight
中的TreeSet
也是O(log n)
。