Scala 的 TreeSet 与 Java 的 TreeSet - 民意调查?
Posted
技术标签:
【中文标题】Scala 的 TreeSet 与 Java 的 TreeSet - 民意调查?【英文标题】:Scala's TreeSet vs Java's TreeSet - poll? 【发布时间】:2013-04-04 10:45:25 【问题描述】:如果我想在 Java 的 TreeSet
中删除 log(n)
时间的最高条目,我使用 treeSet.pollFirst()
- Scala 的 mutable.TreeSet
类的等效项是什么?
无论如何,我真正想要的是一个类似堆的优先级队列数据结构,它可以让我在对数时间内removeMax
、add
和updatePriority
。我查看了 Scala 集合库,我很困惑 - 而mutable.PriorityQueue
让我在对数时间内deque
(即removeMax
) - 它无法更新日志时间的优先级(我不得不粗暴地扫描并删除项目并在线性时间内重新添加)。同样mutable.TreeSet
会让我在对数时间内更新优先级(通过删除和重新添加),但它没有removeMax
(即pollFirst
)操作。我应该使用什么收藏容器?请不要将我引用到外部依赖项。
【问题讨论】:
您认为updatePriority
会与Java 的TreeSet
一起使用吗?
简单(假设您通过使用匿名类覆盖 TreeSet 来定义外部比较器)。您只需删除并添加节点。看看我的例子。看这里的第 19 行和第 33-36 行:github.com/pathikrit/scalgos/blob/master/temp/SandBox/…
对,有道理。不过,您应该在更新之前删除该节点。
【参考方案1】:
您可以使用immutable.TreeSet
中的head
和last
方法,即O(log n)
。
mutable.TreeSet
中存在相同的方法,但没有被覆盖以提供更好的效率和摊销时间(在 Scala 2.10 中)。 head
方法将是对数的,但这样做时可能会实例化一个迭代器。 last
方法实际上会遍历它,具有线性复杂度。好消息是,您可以使用自定义 Ordering
控制最小或最大的内容 - 并通过调用 Ordering.reverse
从现有的 Ordering
轻松获取它。
如果您需要删除该元素,只需使用-=
。您可以创建自己的隐式值类以在树集上搭载方法 pollFirst
。
implicit class MyExtensions[T](ts: mutable.TreeSet[T]) extends AnyVal
def pollFirst(): T =
val elem = ts.head
ts -= elem
elem
【讨论】:
head 和 last 相当于peekFirst
和 peekLast
- 我想要的是 poll
在识别TreeSet
中的任何元素后,使用-=
将其删除是很简单的。
啊,好吧,但这比简单的pollLast
丑多了【参考方案2】:
不是答案,只是一个建议 :) 请记住,您可以从 scala 访问 Java 库(好吧,如果您编译到 JVM :) 所以如果 Java 的 TreeSet 适合您,请使用它 :)
您还可以阐明您的要求;您的 updatePriority 方法的参数是什么?您尝试更新谁的优先级?
【讨论】:
以上是关于Scala 的 TreeSet 与 Java 的 TreeSet - 民意调查?的主要内容,如果未能解决你的问题,请参考以下文章
Java集合详解7:HashSet,TreeSet与LinkedHashSet