C++ 优先队列 (PRIORITY_QUEUE) 详解
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
什么是优先队列
优先队列是一种特殊的队列,它并不按先进先出的顺序弹出元素,而是按照优先级弹出元素。每次弹出的都是当前容器中优先级最高的元素。
从数据结构的角度看,优先队列通常使用堆来实现,最常见的实现是二叉堆。在 C++ 标准库中,priority_queue 就是一个基于堆的容器适配器。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PRIORITY_QUEUE的基本使用
priority_queue 定义在头文件 <queue> 中,
使用时需要使用万能头或导入<queue>
priority_queue 的功能和queue 差不多
* push(x) : 将元素 x 插入队列,时间复杂度 O(log n)
* pop() : 弹出优先级最高的元素,时间复杂度 O(log n)
* top() : 返回优先级最高的元素(只读),时间复杂度 O(1)
* empty() : 判断队列是否为空
* size() : 返回元素个数
> 注意:与普通队列 queue 不同,priority_queue 的“队首”是 top() 而不是 front();同样也没有 back() 方法,因为只关心优先级最高的元素。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
优先队列的优先级
priority_queue 有两中:
具体使用哪个根据题意
练习
* P1168 中位数是一道非常经典的优先队列题,建议做一下
题意:
输入n个数,输出前奇数个数的中位数。
分析:
普通思路暴力肯定会超时,所以要用优先队列。
思路:
把序列分成两个优先队列,一个大根堆,一个小根堆
如果听完还是不懂的,可以参考P1168 中位数 题解
byebye,有问题发到评论区