可以使用简单队列制作优先级队列吗

Can priority queue be made by using simple queues

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

差不多。

您不能 "sort" 标准队列,因为它没有随机访问。 std::priority_queue 通常由向量支持。

它只是为您完成 "automatic sorting",仅此而已。你实际上不会重新排序整个事情(这会做很多毫无意义的比较):你会做一个 lower/upper 绑定搜索来插入你的新元素的位置。删除可以类似地专门化,因为你知道元素是排序的,所以可以进行二进制搜索。

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

A priority queue 是一个抽象数据结构,具有一些必需的操作:

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

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

一个queue是一个抽象的数据结构,你在后面插入,在前面删除,所以它不能用来实现优先级队列(没有"ordering",除了先进先出)。

实现优先级队列最简单的方法通常是使用标准库中定义的 binary heap. A minimalist C++ implementation using a std::vector<int> as a backend and the heap operations 可以是:

#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;
}

insertpop 的(摊销)O(log n) 复杂度。