优先队列priority_queue的使用
优先队列是队列的一种,不过它可以按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序。
每次的push和pop操作,队列都会动态的调整,以达到我们预期的方式来存储。例如:我们常用的操作就是对数据排序,优先队列默认的是数据大的优先级高。所以我们无论按照什么顺序push一堆数,最终在队列里总是top出最大的元素。
使用优先队列需要包含STL头文件<queue>。
- 以一个例子来解释吧:
- view plaincopy to clipboardprint?
- /*优先队列的基本使用 2010/7/24 dooder*/
- #include<stdio.h>
- #include<functional>
- #include<queue>
- #include<vector>
- using namespace std;
- //定义结构,使用运算符重载,自定义优先级1
- struct cmp1{
- bool operator ()(int &a,int &b){
- return a>b;//最小值优先
- }
- };
- struct cmp2{
- bool operator ()(int &a,int &b){
- return a<b;//最大值优先
- }
- };
- //定义结构,使用运算符重载,自定义优先级2
- struct number1{
- int x;
- bool operator < (const number1 &a) const {
- return x>a.x;//最小值优先
- }
- };
- struct number2{
- int x;
- bool operator < (const number2 &a) const {
- return x<a.x;//最大值优先
- }
- };
- int a[]={14,10,56,7,83,22,36,91,3,47,72,0};
- number1 num1[]={14,10,56,7,83,22,36,91,3,47,72,0};
- number2 num2[]={14,10,56,7,83,22,36,91,3,47,72,0};
- int main()
- { priority_queue<int>que;//采用默认优先级构造队列
- priority_queue<int,vector<int>,cmp1>que1;//最小值优先
- priority_queue<int,vector<int>,cmp2>que2;//最大值优先
- priority_queue<int,vector<int>,greater<int> >que3;//注意“>>”会被认为错误,
- //这是右移运算符,所以这里用空格号隔开
- priority_queue<int,vector<int>,less<int> >que4;////最大值优先
- priority_queue<number1>que5;
- priority_queue<number2>que6;
- int i;
- for(i=0;a[i];i++){
- que.push(a[i]);
- que1.push(a[i]);
- que2.push(a[i]);
- que3.push(a[i]);
- que4.push(a[i]);
- }
- for(i=0;num1[i].x;i++)
- que5.push(num1[i]);
- for(i=0;num2[i].x;i++)
- que6.push(num2[i]);
- printf("采用默认优先关系:\n(priority_queue<int>que;)\n");
- printf("Queue 0:\n");
- while(!que.empty()){
- printf("%3d",que.top());
- que.pop();
- }
- puts("");
- puts("");
- printf("采用结构体自定义优先级方式一:\n(priority_queue<int,vector<int>,cmp>que;)\n");
- printf("Queue 1:\n");
- while(!que1.empty()){
- printf("%3d",que1.top());
- que1.pop();
- }
- puts("");
- printf("Queue 2:\n");
- while(!que2.empty()){
- printf("%3d",que2.top());
- que2.pop();
- }
- puts("");
- puts("");
- printf("采用头文件\"functional\"内定义优先级:\n(priority_queue<int,vector<int>,greater<int>/less<int> >que;)\n");
- printf("Queue 3:\n");
- while(!que3.empty()){
- printf("%3d",que3.top());
- que3.pop();
- }
- puts("");
- printf("Queue 4:\n");
- while(!que4.empty()){
- printf("%3d",que4.top());
- que4.pop();
- }
- puts("");
- puts("");
- printf("采用结构体自定义优先级方式二:\n(priority_queue<number>que)\n");
- printf("Queue 5:\n");
- while(!que5.empty()){
- printf("%3d",que5.top());
- que5.pop();
- }
- puts("");
- printf("Queue 6:\n");
- while(!que6.empty()){
- printf("%3d",que6.top());
- que6.pop();
- }
- puts("");
- return 0;
- }
- /*
- 运行结果 :
- 采用默认优先关系:
- (priority_queue<int>que;)
- Queue 0:
- 91 83 72 56 47 36 22 14 10 7 3
- 采用结构体自定义优先级方式一:
- (priority_queue<int,vector<int>,cmp>que;)
- Queue 1:
- 3 7 10 14 22 36 47 56 72 83 91
- Queue 2:
- 91 83 72 56 47 36 22 14 10 7 3
- 采用头文件"functional"内定义优先级:
- (priority_queue<int,vector<int>,greater<int>/less<int> >que;)
- Queue 3:
- 3 7 10 14 22 36 47 56 72 83 91
- Queue 4:
- 91 83 72 56 47 36 22 14 10 7 3
- 采用结构体自定义优先级方式二:
- (priority_queue<number>que)
- Queue 5:
- 3 7 10 14 22 36 47 56 72 83 91
- Queue 6:
- 91 83 72 56 47 36 22 14 10 7 3
- */
- 运行结果:
- 采用默认优先关系:
- (priority_queue<int>que;)
- Queue 0:
- 91 83 72 56 47 36 22 14 10 7 3
- 采用结构体自定义优先级方式一:
- (priority_queue<int,vector<int>,cmp>que;)
- Queue 1:
- 3 7 10 14 22 36 47 56 72 83 91
- Queue 2:
- 91 83 72 56 47 36 22 14 10 7 3
- 采用头文件"functional"内定义优先级:
- (priority_queue<int,vector<int>,greater<int>/less<int> >que;)
- Queue 3:
- 3 7 10 14 22 36 47 56 72 83 91
- Queue 4:
- 91 83 72 56 47 36 22 14 10 7 3
- 采用结构体自定义优先级方式二:
- (priority_queue<number>que)
- Queue 5:
- 3 7 10 14 22 36 47 56 72 83 91
- Queue 6:
- 91 83 72 56 47 36 22 14 10 7 3
- 优先队列的默认优先级是按照从小到大的顺序排列的。
优先队列在解决很多问题的时候很方便,最常用的一个是用来对数组进行排序,这个就不讲了,除此之外,比较常见的一个用法是可以用来做哈夫曼数。
比如一道这样的题:
- 题意:给出一行字符串,求出其原编码需要的编码长度和哈夫曼编码所需的长度,并求其比值
- 分析:根据哈夫曼生成树的生成过程可知,其生成树的权值是固定的而且这个值是最小的,而且其值根据生成树的顺序,我们可以找出规律而
- 不需要真的去生成一棵树然后再求出权值,其模拟过程为取出队列中权值最小的两个元素,将其值加入结果中,然后将这两个元素的权值求和
- 即得出其父节点的权值,将生成元素作为结点入队~~如此循环,直至取出队列中最后两个元素加入结果,实现代码如下:
- view plaincopy to clipboardprint?
- /*HDU 1053 采用广搜求哈夫曼生成树的权值 0ms dooder*/
- #include<stdio.h>
- #include<string.h>
- #include<ctype.h>
- #include<functional>
- #include<queue>
- using namespace std;
- #define M 1000050
- char str[M];
- int list[27];
- priority_queue< int,vector<int>,greater<int> >que;
- int main()
- {
- int ans,sum;
- int i,a,b,c;
- while(scanf("%s",str),strcmp(str,"END")){
- memset(list,0,sizeof(list));
- for(i=0;str[i];i++){
- if(isalpha(str[i]))
- list[str[i]-'A']++;
- else
- list[26]++;
- }
- sum=i*8;ans=i;c=0;
- for(i=0;i<27;i++){
- if(list[i]){
- que.push(list[i]);
- c++;
- }
- }
- if(c>1){ans=0;//注意只有一种字符的情况
- while(que.size()!=1){
- a=que.top();
- que.pop();
- b=que.top();
- que.pop();
- ans+=a+b; //核心代码
- que.push(a+b);
- }
- while(!que.empty())//使用后清空队列
- que.pop();
- }
- printf("%d %d %.1f\n",sum,ans,1.0*sum/ans);
- }
- return 0;
- }
- 其次,还有以下几种用途:
1.一些任务调度算法
比如操作系统的线程的调度算法,有的是按照优先级来调度的,每次都执行优先级较高的线程
2.合并n个文件为1个有序文件
首先把n个有序文件的第一个元素取出来,放到优先队列里面,然后取最小值,然后再插入元素导优先队列,取最小值。
3、由于优先队列内部是由堆实现的,所以适用于堆的都适用于优先队列
比如排序,找中位数,找最大的k个数
优先队列priority_queue的使用的更多相关文章
- 浅谈C++ STL中的优先队列(priority_queue)
从我以前的博文能看出来,我是一个队列爱好者,很多并不是一定需要用队列实现的算法我也会采用队列实现,主要是由于队列和人的直觉思维的一致性导致的. 今天讲一讲优先队列(priority_queue),实际 ...
- 优先队列priority_queue的简单应用
优先队列 引入 优先队列是一种特殊以及强大的队列. 那么优先队列是什么呢? 说白了,就是一种功能强大的队列. 它的功能强大在哪里呢? 四个字:自动排序. 优先队列的头文件&&声明 头文 ...
- 9.优先队列,priority_queue
#include <iostream> #include <queue> #include <deque> #include <list> using ...
- 892A. Greed#贪婪(优先队列priority_queue)
题目出处:http://codeforces.com/problemset/problem/892/A 题目大意:有一些可乐(不一定装满),问能不能把所有可乐装进两个可乐瓶中 #include< ...
- 【STL】优先队列priority_queue详解+OpenJudge-4980拯救行动
一.关于优先队列 队列(queue)这种东西广大OIer应该都不陌生,或者说,队列都不会你还学个卵啊(╯‵□′)╯︵┻━┻咳咳,通俗讲,队列是一种只允许从前端(队头)删除元素.从后端(队尾)插入元素的 ...
- 优先队列priority_queue的比较函数
STL头文件:#include<queue> 优先队列: 默认从大到小排列:priority_queuee<node>q; 自定义优先级的三种方法: 1.重载操作符: bool ...
- [转]c++优先队列(priority_queue)用法详解
既然是队列那么先要包含头文件#include <queue>, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队 优先队列具有队列的所有特性, ...
- STL队列 之FIFO队列(queue)、优先队列(priority_queue)、双端队列(deque)
1.FIFO队列 std::queue就是普通意思上的FIFO队列在STL中的模版. 1.1主要的方法有: (1)T front():访问队列的对头元素,并不删除对头元素 (2)T back(): ...
- C++ STL 优先队列 priority_queue 详解(转)
转自https://blog.csdn.net/c20182030/article/details/70757660,感谢大佬. 优先队列 引入 优先队列是一种特殊的队列,在学习堆排序的时候就有所了解 ...
- 优先队列priority_queue
优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素.但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队.这点类似于给队列 ...
随机推荐
- CentOS7 中使用 firewall-cmd 控制端口和端口转发
0X00 firewalld 守护进程 firewall-cmd命令需要firewalld进程处于运行状态.我们可以使用systemctl status/start/stop/restart fire ...
- CF-1114 (2019/02/11)
CF-1114 A. Got Any Grapes? skip B. Yet Another Array Partitioning Task 将n个数分成连续的k组,使得每组的前m大的数字的总和最大. ...
- 转 Spring源码剖析——核心IOC容器原理
Spring源码剖析——核心IOC容器原理 2016年08月05日 15:06:16 阅读数:8312 标签: spring源码ioc编程bean 更多 个人分类: Java https://blog ...
- SEO 优化
1.什么是SEO优化: 简单的来说就是了解搜索引擎的排名规则,投机所好,让我们的网站在搜索引擎上得到靠前的排名,获取更多流量的一种方式. 2.SEO优化-衡量标准 关键词的排名--核心关键词的效果 收 ...
- Applied Nonparametric Statistics-lec7
Ref: https://onlinecourses.science.psu.edu/stat464/print/book/export/html/9 经过前面的步骤,我们已经可以判断几个样本之间是否 ...
- LeetCode(219) Contains Duplicate II
题目 Given an array of integers and an integer k, find out whether there are two distinct indices i an ...
- freertos知识点笔记——队列、二值信号量、计数信号量
队列1.队列queue通常用于任务之间的通信,一个任务写缓存,另一个任务读缓存.队列还会有等待时间,2.阻塞超时时间.如果在发送时队列已满,这个时间即是任务处于阻塞态等待队列空间有效的最长等待时间.如 ...
- CodeForces - 948C Producing Snow(优先队列)
题意: n天. 每天你会堆一堆雪,体积为 v[i].每天都有一个温度 t[i] 所有之前堆过的雪在第 i 天体积都会减少 t[i] . 输出每天融化了的雪的体积. 这个题的正解我怎么想都很难理解,但是 ...
- 【转】MySQL innodb_autoinc_lock_mode 详解 ,并发插入时主键冲突的解决方案
本文转载于 http://www.cnblogs.com/JiangLe/p/6362770.html innodb_autoinc_lock_mode这个参数控制着在向有auto_increment ...
- CSS 工程化 小结
CSS 工程化 组成:1.组织 (代码目录)2.优化(那种实现方式更好) 3.构建(代码完成后需要经过哪些处理步骤) 4.维护 常见问题 1.如何解决 CSS 模块化问题 1.Less Sass 等C ...