如果我要删除Java log(n)
中TreeSet
时间内的最高条目,我会使用treeSet.pollFirst()
- Scala mutable.TreeSet
类的等效内容是什么?
无论如何,我真正想要的是一个类似堆的优先级队列数据结构,它允许我以对数时间removeMax
,add
和updatePriority
。我查看了Scala集合库,我很困惑 - 虽然mutable.PriorityQueue
让我deque
(即removeMax
)处于对数时间 - 它无法在日志时间内更新优先级(我会必须hackily扫描和删除项目并重新添加线性时间)。同样地,mutable.TreeSet
会让我在对数时间内更新优先级(通过hackily删除和重新添加),但它没有removeMax
(即pollFirst
)操作。我应该使用什么集合容器?请不要将我介绍给外部依赖项。
答案 0 :(得分:3)
您可以使用head
中的last
和immutable.TreeSet
方法,O(log n)
。
mutable.TreeSet
中存在相同的方法,但没有被覆盖以提供更好的效率和摊销时间(在Scala 2.10中)。 head
方法将是对数的,但可以在执行此操作时实例化迭代器。 last
方法实际上会遍历它,具有线性复杂性。好消息是,您可以使用自定义Ordering
控制最小或最大的内容 - 并通过调用Ordering
从现有Ordering.reverse
轻松获取。
如果您需要删除该元素,只需使用-=
即可。您可以创建自己的隐式值类来回退树集上的方法pollFirst
。
implicit class MyExtensions[T](ts: mutable.TreeSet[T]) extends AnyVal {
def pollFirst(): T = {
val elem = ts.head
ts -= elem
elem
}
}
答案 1 :(得分:1)
不是答案,只是一个建议:)记住你可以从scala访问Java库(好吧,如果你编译到JVM :)所以如果Java的TreeSet适合你,请使用它:)
您还可以澄清您的要求;你的updatePriority方法的参数是什么?你试图更新谁的优先权?