在 Scala 中创建最小堆的最简单和最有效的方法是啥?
Posted
技术标签:
【中文标题】在 Scala 中创建最小堆的最简单和最有效的方法是啥?【英文标题】:What is the easiest and most efficient way to make a min heap in Scala?在 Scala 中创建最小堆的最简单和最有效的方法是什么? 【发布时间】:2014-11-25 05:43:31 【问题描述】:val maxHeap = scala.collection.mutable.PriorityQueue[Int] //Gives MaxHeap
使用Ordering将PriorityQueue变成minHeap最简洁有效的方法是什么?
【问题讨论】:
仅供参考,很多时候“最简单”和“最有效”是相互排斥的。 好记:val minHeap = PriorityQueue[Int]()(Ordering[Int].reverse)
【参考方案1】:
你必须定义你自己的Ordering
:
scala> object MinOrder extends Ordering[Int]
def compare(x:Int, y:Int) = y compare x
defined object MinOrder
然后在创建堆时使用它:
scala> val minHeap = scala.collection.mutable.PriorityQueue.empty(MinOrder)
minHeap: scala.collection.mutable.PriorityQueue[Int] = PriorityQueue()
scala> minHeap.ord
res1: Ordering[Int] = MinOrder$@158ac84e
【讨论】:
我认为您甚至不需要创建自己的 Ordering,您可以使用已经存在的方法 .reverse:Ordering[Int].reverse 用于完成 val minHeap = scala.collection.mutable.PriorityQueue.empty(Ordering[Int].reverse) codebunk.com/pb/788100787【参考方案2】:2016 年 8 月更新:您可以考虑来自 Chris Okasaki (chrisokasaki
) 的提案 chrisokasaki/scads/scala/heapTraits.scala
。
该提案说明了Heap
的“不那么容易”部分:
具有合并操作的类型安全堆的概念证明。 在这里,“类型安全”意味着接口绝不允许在同一个堆中混合不同的排序。 特别是,
向现有堆添加元素时,该插入不能涉及与用于创建现有堆的顺序不同的顺序,并且 合并两个现有堆时,保证创建的堆具有相同的顺序。
见its design。
val h1 = LeftistHeap.Min.empty[Int] // an empty min-heap of integers
【讨论】:
以上是关于在 Scala 中创建最小堆的最简单和最有效的方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章