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 类的等效项是什么?

无论如何,我真正想要的是一个类似堆的优先级队列数据结构,它可以让我在对数时间内removeMaxaddupdatePriority。我查看了 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中的headlast方法,即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 相当于 peekFirstpeekLast - 我想要的是 poll 在识别TreeSet 中的任何元素后,使用-= 将其删除是很简单的。 啊,好吧,但这比简单的pollLast丑多了【参考方案2】:

不是答案,只是一个建议 :) 请记住,您可以从 scala 访问 Java 库(好吧,如果您编译到 JVM :) 所以如果 Java 的 TreeSet 适合您,请使用它 :)

您还可以阐明您的要求;您的 updatePriority 方法的参数是什么?您尝试更新谁的优先级?

【讨论】:

以上是关于Scala 的 TreeSet 与 Java 的 TreeSet - 民意调查?的主要内容,如果未能解决你的问题,请参考以下文章

Java集合详解7:HashSet,TreeSet与LinkedHashSet

Scala性能比较之集合

java源码之TreeSet

Java基础——TreeSet

Java集合详解7:HashSet,TreeSet与LinkedHashSet

Java - TreeSet源码解析