2.8、说一说你了解的优先级队列?
它本质上是基于堆(heap)数据结构实现的,主要特点是每次访问的元素都是当前队列中优先级最高的元素,而非先进先出(FIFO)规则。
关键特性与实现原理
底层容器
- • 默认使用
std::vector
作为底层存储容器 - • 也可指定为
std::deque
等支持随机访问迭代器的容器 - • 要求底层容器支持
push_back
和pop_back
操作,以便维护堆结构
堆结构维护
- • 利用堆算法(
make_heap
、push_heap
、pop_heap
)维护元素顺序 - • 默认为最大堆(优先级最高元素最大,位于堆顶)
访问与操作接口
接口 | 功能描述 | 时间复杂度 |
top() |
访问当前优先级最高的元素 | O(1) |
push(x) |
插入元素 | O(log N) |
pop() |
移除堆顶元素 | O(log N) |
empty() |
判断是否为空 | O(1) |
size() |
获取元素数量 | O(1) |
优先级定义
- • 默认比较函数:
std::less<T>
(实现最大堆,较大元素优先) - • 自定义方式:
- • 第三个模板参数传入
std::greater<T>
实现最小堆 - • 自定义仿函数或重载
operator<
实现复杂优先级规则
- • 第三个模板参数传入
使用示例
#include <queue>
#include <vector>
#include <functional>
#include <iostream>
int main() {
// 最大堆(默认)
std::priority_queue<int> maxHeap;
maxHeap.push(10);
maxHeap.push(30);
maxHeap.push(20);
std::cout << maxHeap.top() << std::endl; // 输出30
// 最小堆
std::priority_queue<int, std::vector<int>, std::greater<int>> minHeap;
minHeap.push(10);
minHeap.push(30);
minHeap.push(20);
std::cout << minHeap.top() << std::endl; // 输出10
return 0;
}
性能优势
- • 插入/删除操作:O(log N)
- • 访问最大元素:O(1)
- • 适用场景:频繁动态维护优先级的场景(如任务调度、Dijkstra算法优化等)
本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
版权声明:
作者:讳疾忌医-note
链接:https://www.1217zy.vip/archives/1822
文章版权归作者所有,未经允许请勿转载。
THE END