是否可以使用简单队列创建优先级队列

Can priority queue be made by using simple queues

本文关键字:队列 创建 优先级 简单 可以使 是否      更新时间:2023-10-16

优先级队列只是一个排序队列吗?可以通过创建一个简单的队列并在之后对其进行排序来实现吗?https://www.quora.com/What-is-the-difference-between-a-priority-queue-and-a-queue?share=1我找到了这个链接,它指出可以通过在插入时重新排列队列来制作优先级队列,并将最近插入的对象放在适当的优先级位置。我想确定这一点,因为我的一些同行说这是不可能的,但是如果我们建立一个遵循优先级的队列,它不会使队列成为优先级队列吗?

优先级队列是一种抽象的数据结构,具有一些必需的操作:

  • 检查空性 (is_empty(;
  • 按"优先级"(insert(插入元素;
  • 查找并删除具有最高优先级 (pop( 的元素。

有很多方法可以实现这一点,但您通常会为popinsert寻找O(log n)(摊销(复杂性。

队列是一种抽象的数据结构,您可以在后面插入并在前面删除,因此它不能用于实现优先级队列(除了先进先出之外,没有"排序"(。

实现优先级队列的最简单方法通常是使用二进制堆。使用std::vector<int>作为后端和标准库中定义的堆操作的极简C++实现可以是:

#include <algorithm>
#include <vector>
using priority_queue = std::vector<int>;
bool is_empty(priority_queue const& q) { return q.empty(); }
void insert(priority_queue &q, int value) { 
q.push_back(value);
std::push_heap(std::begin(q), std::end(q));
}
int pop(priority_queue &q) {
std::pop_heap(std::begin(q), std::end(q));
const int value = q.back();
q.pop_back();
return value;
}

这为您提供了(摊销(insertpopO(log n)复杂性。

差不多。

您无法对标准队列进行"排序",因为它没有随机访问。std::priority_queue通常由向量支持。

它只是为您进行"自动排序",仅此而已。你实际上不会对整个事情进行重新排序(这会做很多毫无意义的比较(:你会做一个下限/上限搜索来插入你的新元素。删除可以同样专门化,因为您知道元素已排序,因此可以进行二叉搜索。

但最终结果是一个行为很像队列的东西,是的。