优先级队列

优先级队列 priority_queue

是一个容器适配器。
不符合先进先出。push时随意,pop和top取优先级最高的。
优先级由大小决定,默认大的优先级高,也可以通过仿函数来控制。

基本接口使用

通过示例:向priority_queue pq内push多个无规律的数字,取其top打印,再pop,直至其中没有数据。
会发现结构是一个大堆,默认的top为最大值。
每次出队都会将堆的结构调整,将右下方的最小值与最顶上的交换,再进行向下调整算法。

如果是想要改变优先级
priority_queue<int, vector<int>, greater<int>> pq
注意第三个模版参数是传递的类型,与改变sort的顺序不同,后者是传入的对象。

class Solution {public:int findKthLargest(vector<int>& nums, int k) {priority_queue<int> pq(nums.begin(), nums.end());while(--k){pq.pop();}return pq.top();}
};

While(k- -)执行k次,while(- - k)执行k - 1次。

优化:利用优先级队列建立含有k个数据的小堆,再将剩下数据与小堆堆顶比较,比小堆top大,就pop小堆,再将其存放进去。

int findKthLargest(vector<int>& nums, int k) {priority_queue<int, vector<int>, greater<int>> kMinHeap;for(size_t i = 0; i < k; i++){kMinHeap.push(nums[i]);} for(size_t i = k; i < nums.size(); i++){if(kMinHeap.top() < nums[i]){kMinHeap.pop();kMinHeap.push(nums[i]);}}return kMinHeap.top();}

模拟实现

仿函数——利用自定义类型中的()运算符重载,模拟出函数。
当然不只是用来比大小。比如自定义日期类,向优先级队列中插入不同日期类对象的地址,然后要选出最大的地址。如果直接取出堆顶,只能得到最大的对象地址,但如果利用仿函数重载(),实现两个日期类对象的地址比较时,返回大的日期。

#include <vector>
namespace yfy {template<class T>
class Less
{public:bool operator()(const T& a, const T& b){return a < b;}
};template<class T>
class Greater
{public:bool operator()(const T& a, const T& b){return a > b;}
};template<class T, class Container = vector<T>, class Compare = Less<T>>
class priority_queue
{public:priority_queue(){}template <class InputIterator>priority_queue(InputIterator first, InputIterator last){//插入数据while(first != last){_con.push_back(*first);first++;}//建堆for(size_t i = (_con.size() - 1 - 1) / 2; i >= 0; i--){AdjustDown(i);}}Compare com;void AdjustUp(size_t child){size_t parent = (child - 1) / 2;while(child > 0){if(com(_con[parent], _con[child])){swap(_con[parent], _con[child]);child = parent;parent = (child - 1) / 2;}else{break;}}}void AdjustDown(size_t parent){size_t l_child = parent * 2 + 1;while(l_child < _con.size()){if(l_child + 1 < _con.size() && com(_con[l_child], _con[l_child + 1])){l_child++;}if(com(_con[parent], _con[l_child])){swap(_con[parent], _con[l_child]);parent = l_child;l_child = parent * 2 + 1;}else{break;}}}void push(const T& val){_con.push_back(val);AdjustUp(_con.size() - 1);}void pop(){swap(_con[0], _con[_con.size() - 1]);_con.pop_back();AdjustDown(0);}const T& top(){return _con.front();}bool empty(){return _con.empty();}private:Container _con;
};void test1()
{priority_queue<int, vector<int>, Greater<int>> pq;pq.push(1);pq.push(0);pq.push(3);pq.push(100);while(!pq.empty()){cout << pq.top() << endl;pq.pop();}
}}

优先级队列基本使用及用C++模拟实现相关推荐

  1. C++STL之优先级队列详解

    priority_queue 文章目录 priority_queue priority_queue的使用 priority_queue在OJ中的使用 数组中第k个最大元素 priority_queue ...

  2. 详解优先级队列priority_queue(应用+模拟实现)

    优先级队列的概念 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元 素 ...

  3. 6-5-3:STL之stack和queue——优先级队列-priority_queue(堆)的基本使用和模拟实现以及仿函数

    文章目录 一:优先级队列-priority_queue(堆) (1)基本使用 (2)模拟实现 二:仿函数 (1)仿函数是什么 (2)使用仿函数完成大顶堆和小顶堆的构建 一:优先级队列-priority ...

  4. 数据结构之堆(Heap),堆的相关操作,用堆模拟优先级队列

    目录 堆的概念 堆的存储方式 堆的相关操作 堆的向下调整. 堆的创建 堆的插入和向上调整 堆的删除 用堆模拟优先级队列 堆的概念 堆是逻辑结构为二叉树存储结构为数组数组的一种数据结构,为什么这么说呢? ...

  5. Java【优先级队列】详细图解 / 模拟实现 + 【PriorityQueue】常用方法介绍

    文章目录 一.什么是优先级队列 二.模拟实现 1, 实现堆的基本操作 1.1, 创建堆 1.2.1, 向下调整 1.2, 堆的插入 1.2.1, 向上调整 1.2, 堆的删除 2, 实现优先级队列 2 ...

  6. 模拟实现priority_queue优先级队列

    优先级队列 无参构造 priority_queue():c(){} 区间构造 区间构造需要用到迭代器,而迭代器每个容器的类型不一样,所以用模板给出,初始化列表,把用户给进来的元素空间起始位置,放到优先 ...

  7. 并发队列-无界阻塞优先级队列

    PriorityBlockingQueue原理探究 一. 前言 PriorityBlockingQueue是带优先级的无界阻塞队列,每次出队都返回优先级最高的元素,是二叉树最小堆的实现,研究过数组方式 ...

  8. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...

  9. [数据结构]用插入排序和选择排序的思想实现优先级队列

    一.问题概述 优先级队列的定义: 优先级队列不同于普通的队列,普通的队列具有先进先出的原则,而优先级队列是选择优先级最高的先出队.那么,如何模拟实现优先级队列呢?在这里,我们将较大的值作为优先级较高的 ...

最新文章

  1. iMeta期刊12名编委入选科睿唯安2021年度高被引学者
  2. 在ORACLE中对存储过程加密
  3. Qt QWidget实现手势缩放和平移(一)
  4. Spring DefaultListableBeanFactory
  5. ribbon源码(1) 概述
  6. 汇总jQuery的61种选择器及示例
  7. Java项目部署到云服务器最简单的方法
  8. python写一个定时关机软件
  9. 我的世界java环境安装包_我的世界JAVA版1.7.10下载安装包最新版 v1.7.10
  10. window10官方工具在线升级失败,终极解决方案
  11. 不用编程,快速实现西门子PLC与罗克韦尔(AB)PLC之间以太网通讯
  12. JavaWeb开发QQ动态表情-源文件
  13. 下列命令中 哪些用于退出MySQL服务_智慧树知到音乐鉴赏(西安交通大学)答案搜题公众号...
  14. html调用properties,聊聊html中的properties和attributes
  15. 记录笔记时得到的人生的两个道理
  16. 图片访问错误显示碎图
  17. Pose Invariant Embedding for Deep Person Re-identification论文翻译
  18. 现代操作系统 第二章 进程与线程 习题
  19. Imagination宣布成立IMG实验室,致力于创造突破性技术
  20. 百度爬虫:百度蜘蛛都有哪些抓取规律和习惯

热门文章

  1. 阿里云——媒体云(视频直播)
  2. JAVA学习Day3
  3. 度小满数据开发面试真题1
  4. linux命令的全称,linux命令的全称~~~·
  5. NLP必不可少的中文数据资源
  6. 分享一些域名在线whois查询
  7. 微信小程序 实现打卡功能
  8. 鼠标移动代码(使用光标健移动)
  9. 读书有益——》《让我留在你身边》
  10. 硅上量子点激光器报告最新进展总结(二)