倒序优先队列[重复]

Posted

技术标签:

【中文标题】倒序优先队列[重复]【英文标题】:Reverse order Priority Queue [duplicate] 【发布时间】:2021-09-22 11:27:11 【问题描述】:

有谁知道是否可以在 Rust 中颠倒优先级队列中的顺序? 当我查看队列时,我希望接收到最低的 i32。但是,它似乎默认返回最高的 i32。

编辑

这是我正在使用的包:docs.rs/priority-queue/1.2.0/priority_queue

【问题讨论】:

嗨@MaxTorreSchau,你应该知道你正在使用哪个包。因为我不相信这是生锈的原生类型?是这个:docs.rs/priority-queue/1.2.0/priority_queue? 是的,没错! 那么不妨看看双优先队列:docs.rs/priority-queue/1.2.0/priority_queue/… 看来peek_min 将非常适合您的需求 如果您不需要即时更改顺序,另一种选择是在推送队列中的项目时反转优先级。 IE。 push (item, -prio) 而不是 push (item, prio) 这能回答你的问题吗? How do I create a BinaryHeap that pops the smallest value, not the largest? 适用于 BinaryHeap,但该方法适用于任何依赖于 PartialEq 的数据结构。 【参考方案1】:

除非您需要从两端访问它,否则使用std::cmp::Reverse 应该是最有效的解决方案。 (例如PriorityQueue<i32, Reverse<i32>>.push(x, Reverse(x))

【讨论】:

如何将它与 PriorityQueue 一起使用? @Jean 我的编辑回答你的问题了吗? 非常好,谢谢! 实际上,如何访问 Reverse 值?找到了,它是一个元组,这很混乱。所以reverse_variable.0 给出了值。【参考方案2】:

根据箱子(包)的documentation。

我相信您应该使用DoublePriorityQueue 而不是PriorityQueue,因为它为队列中的peek 提供了最高值或最低值。分别使用peek_maxpeek_min

查看他们在documentation中提供的代码的sn-p:

use priority_queue::DoublePriorityQueue;

let mut pq = DoublePriorityQueue::new();

assert!(pq.is_empty());
pq.push("Apples", 5);
pq.push("Bananas", 8);
pq.push("Strawberries", 23);

assert_eq!(pq.peek_max(), Some((&"Strawberries", &23)));
assert_eq!(pq.peek_min(), Some((&"Apples", &5)));

pq.change_priority("Bananas", 25);
assert_eq!(pq.peek_max(), Some((&"Bananas", &25)));

for (item, _) in pq.into_sorted_iter() 
    println!("", item);

【讨论】:

以上是关于倒序优先队列[重复]的主要内容,如果未能解决你的问题,请参考以下文章

HDU 4857 拓扑排序 优先队列

修改队列内容后如何从优先级队列中获取最小元素[重复]

Java优先级队列heapify [重复]

python中具有重复键的优先级队列

HDU 6301 (贪心+优先队列)

使用广度优先搜素查找路径