我想获得一个代码示例,用于完成优先级队列中项目的升序。
我想将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))
如何将插入时的第一个元素升序应用于上述内容?
谢啦
您只需提及队列项目的顺序。以下代码将用于此目的。
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()))
避免使用反向,因为这会产生不必要的开销。
如果只需要反转隐式排序,则可以立即反转队列:
val pq = PriorityQueue.empty[(Int, String)].reverse
<代码>优先队列。应用和优先队列。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的算法。下面是我不明白的书中的一部分: 如果图足够稀疏--特别是-我们可以通过用二进制最小堆实现最小优先级队列来改进算法。 为什么图形应该是稀疏的? 下面是另一部分: