是否可以使用简单队列创建优先级队列
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我找到了这个链接,它指出可以通过在插入时重新排列队列来制作优先级队列,并将最近插入的对象放在适当的优先级位置。我想确定这一点,因为我的一些同行说这是不可能的,但是如果我们建立一个遵循优先级的队列,它不会使队列成为优先级队列吗?
优先级队列是一种抽象的数据结构,具有一些必需的操作:
- 检查空性 (
is_empty
(; - 按"优先级"(
insert
(插入元素; - 查找并删除具有最高优先级 (
pop
( 的元素。
有很多方法可以实现这一点,但您通常会为pop
和insert
寻找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;
}
这为您提供了(摊销(insert
和pop
O(log n)
复杂性。
差不多。
您无法对标准队列进行"排序",因为它没有随机访问。std::priority_queue
通常由向量支持。
它只是为您进行"自动排序",仅此而已。你实际上不会对整个事情进行重新排序(这会做很多毫无意义的比较(:你会做一个下限/上限搜索来插入你的新元素。删除可以同样专门化,因为您知道元素已排序,因此可以进行二叉搜索。
但最终结果是一个行为很像队列的东西,是的。
相关文章:
- 在C++中创建队列 - 什么是 malloc 错误?
- 避免使用 boost::进程间::消息队列创建文件
- 是否可以使用简单队列创建优先级队列
- C++ Poco - 如何创建通知队列的向量?
- 如何在 c++ 中创建对的优先级队列.这会弹出具有最小值的元素.默认的弹出最大值
- 如何使用用户输入创建字符串队列?
- 使用加速进程间创建消息队列 - 内存访问冲突
- 为什么我不能在 Windows 中的 rabbitmq 中创建队列?
- 为队列创建C 全局变量
- 创建多类队列C++
- C 在标题文件中创建具有结构定义的结构的队列
- 我有一个问题,创建了C 中阻塞队列的向量
- 无法创建支持传输队列的 VkDevice
- 关于使用我自己创建的类使用优先级队列的问题
- 从调度队列块 [ swift / c++ ] 创建线程
- 在.c文件接收函数中使用Linux中的MSGGET创建消息队列未实现错误
- 尝试使用堆栈创建队列.为什么我会遇到int转换错误的空白
- 用管道在C++中创建调度队列/线程处理程序:FIFO溢出
- 从 STL 优先级队列创建最小堆
- boost::进程间消息队列创建时的竞争条件