在 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 中创建最小堆的最简单和最有效的方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

构建非循环依赖关系的最简单和最有效的数据结构是啥?

在 Firebird 数据库中创建自动增量字段的最简单方法

使用 C# 在 ASP.NET MVC 3 中创建级联下拉列表的最简单方法

从字典列表中创建NumPy记录数组的最简单方法?

有没有一种简单的方法可以在 C++ 中创建一个最小堆?

在Android中创建用户可选择的字符串列表的最简单方法是什么?