当前位置: 首页 > 知识库问答 >
问题:

Scala有序优先级队列,始终以最低数量作为头部,升序

澹台硕
2023-03-14

我想获得一个代码示例,用于完成优先级队列中项目的升序。

我想将Tuple2(Int, String)存储在优先级队列中,以便按元组的第一个元素按升序排序。如果我的优先级队列称为pq并且我调用pq.head我想获取数字最低的元组,与调用pq.dequeue相同。

scala> val pq = scala.collection.mutable.PriorityQueue[(Int, String)]()
pq: scala.collection.mutable.PriorityQueue[(Int, String)] = PriorityQueue()

scala> pq += Tuple2(8, "eight")
res60: pq.type = PriorityQueue((8,eight))

scala> pq += Tuple2(4, "four")
res61: pq.type = PriorityQueue((8,eight), (4,four))

scala> pq += Tuple2(7, "seven")
res62: pq.type = PriorityQueue((8,eight), (4,four), (7,seven))

如何将插入时的第一个元素升序应用于上述内容?

谢啦

共有3个答案

诸葛雨泽
2023-03-14

您只需提及队列项目的顺序。以下代码将用于此目的。

  def ascendingOrder(tuple2: (Int, String)) = -tuple2._1
  val pq = PriorityQueue[(Int, String)]()(Ordering.by(ascendingOrder))
  pq += Tuple2(8, "eight")
  pq += Tuple2(4, "four")
  pq += Tuple2(7, "seven")
  for (i <- 1 to 3) (println(pq.dequeue()))

避免使用反向,因为这会产生不必要的开销。

马琛
2023-03-14

如果只需要反转隐式排序,则可以立即反转队列:

val pq = PriorityQueue.empty[(Int, String)].reverse
支铭晨
2023-03-14

<代码>优先队列。应用和优先队列。empty都采用隐式排序实例,该实例将用于排序内容。根据该排序,head将是“最大”值。您将获得元组的默认值,这是元组元素的字典排序,这不是您想要的,因为它将使第一个元素最大的元组成为头部。

有几种方法可以解决这个问题。最简单的方法就是调用。在队列上反转,这将为您提供一个具有相同内容但顺序相反的新队列,这意味着具有最小值的元组将是头部。

您还可以在创建队列时提供自己的排序:

import scala.collection.mutable.PriorityQueue

val pq = PriorityQueue.empty[(Int, String)](
  implicitly[Ordering[(Int, String)]].reverse
)

或者,如果您明确不希望咨询第二个元素:

val pq = PriorityQueue.empty[(Int, String)](
  Ordering.by((_: (Int, String))._1).reverse
)

这可能比反转队列更有效率,但可能还不足以让人担心,因此您应该选择您认为最优雅的方法。

 类似资料:
  • 我正在编写一个最小优先级队列和一个最大优先级队列,如下所示: 输入数组的数字将一个接一个地添加到队列中。然而,当数组[12,4,5,3,8,7]是一个样本输入,打印优先队列的输出是: MIN:[3.0, 4.0, 5.0, 12.0, 8.0, 7.0]MAX:[12.0, 8.0, 7.0, 3.0, 4.0, 5.0] 我定义的比较器有什么问题吗?提前感谢你的帮助。

  • 我定义最大优先级队列如下: 我需要理解这是如何工作的,特别是当1只得到2的索引(而不是4)时? 多谢了。

  • 我有一个,名为,其中包含类型的对象。 您可以在所有车辆上调用该方法。 我要做的是排序,这样车辆被赋予更高的优先级,并被放在队列的前面。 我假设我必须在这里使用一个比较器,但不知道怎么做。

  • 我对Java中优先级队列初始容量的使用感到困惑。如官方文档所示,有一个以初始容量为参数的构造函数。但是当我用构造函数指定初始容量并开始将整数放入其中时,优先级队列的大小会大于初始容量。 例如,我将一个PQ的初始容量指定为3,并将10个不同的数字放入其中,这样我就可以得到第三个最小的数字,但结果发现那个队列中有10个数字。要处理这一点,我总是要手动移除一些数字,所以我想知道初始容量是如何工作的,或者

  • 我在CLRS,第三版(第662页)中读到了Dijkstra的算法。下面是我不明白的书中的一部分: 如果图足够稀疏--特别是-我们可以通过用二进制最小堆实现最小优先级队列来改进算法。 为什么图形应该是稀疏的? 下面是另一部分: