优先队列总结
来源:互联网 发布:淘宝代绣十字绣可信吗 编辑:程序博客网 时间:2024/05/20 07:34
1.C++优先队列的使用示例
1.1 C++优先队列常规使用方法
头文件#include <queue>
声明如下:priority_queue<int, vector<int>, greater<int> >
#include <iostream>#include <queue>using namespace std;priority_queue<int, vector<int>, greater<int> >humble;int main(){ for(int i=5;i>0;i--) { humble.push(i); } while(!humble.empty()) { cout<<humble.top()<<endl; humble.pop(); } return 0;}
1.2自定义优先队列
自定义优先队列需要在结构体中重载比较符。用法如下:
#include<iostream>#include<queue>using namespace std;struct treenode{ int weight; int value; friend bool operator< (treenode a, treenode b) { return a.value < b.value; }};priority_queue<treenode> prique;int main(){ for (int i = 0; i < 4; i++) { treenode tempnode; tempnode.value = 4-i; tempnode.weight = i; prique.push(tempnode); } cout<<prique.top().value; return 0;}
2.C++优先队列的应用
杭电oj1058
http://acm.hdu.edu.cn/showproblem.php?pid=1058
题意:当一个数只有2、3、5、7这四种质因数时(也可以一种都没有或只有其中几种),这个数就是丑数,输出第 n 个丑数是多少;
解题思路:
首先生成丑数值小于2000000000的丑数数组:
设a[i]为存入第i个丑数的数组元素,pri_humble为递增的优先队列
(1)将1存入a[0];
(2)将2,3,5,7存入优先队列pri_humble中
(3)将优先队列中最小的值出队列存入数组的下一个元素(如a[1]=2)
(4)将这个最小的值分别乘以2,3,5,7加入到优先队列中
(5)重复(3)(4)步骤直到 2000000000
由于队列中会有重复数据,因此在出队列的时候判断与前一个数组元素是否相等,如果相等,继续下一个出队列
#include <iostream>#include <queue>using namespace std;priority_queue<long long, vector<long long>, greater<long long> >pri_humble;long long a[5851];int main(){ long long n; long long k=1; a[0]=1;//1.将1存入a[0]; pri_humble.push(2);//2.将2,3,5,7存入优先队列pri_humble中 pri_humble.push(3); pri_humble.push(5); pri_humble.push(7); while(k<5850) { if(pri_humble.top()==a[k-1])//相等继续下一个出队列 { pri_humble.pop(); }else//不相等,执行(3)(4)操作 { a[k]=pri_humble.top(); pri_humble.pop(); pri_humble.push(a[k]*2); pri_humble.push(a[k]*3); pri_humble.push(a[k]*5); pri_humble.push(a[k]*7); k++; } } while(cin>>n&&n!=0)//按题目格式输出 { cout<<"The "<<n; if(n%10 == 1 && n%100 != 11) cout<<"st "; else if(n%10 == 2 && n%100 != 12) cout<<"nd "; else if(n%10 == 3 && n%100 != 13) cout<<"rd "; else cout<<"th "; cout<<"humble number is "<<a[n-1]<<endl; } return 0;}
3堆排序
那么优先队列如何实现的呢?
因此需要用到常用数据结构中的堆
下面代码实现了新建一个堆,并用堆排序的算法
将算法导论的伪代码转换为c语言代码
#include <stdio.h>#include <stdlib.h>/* a为数组,s表示a的元素下标,n表示要调整堆的个数,作用为使s为根的子树成为最大堆*/int maxHeapify(int *a,int s,int n){ int largest=0; int temp; int left=s*2+1; int right=left+1; if(left<n&&a[left]>a[s]) { largest=left; }else{ largest=s; } if(right<n&&a[right]>a[largest]) { largest=right; } if(largest!=s) { temp=a[s]; a[s]=a[largest]; a[largest]=temp; maxHeapify(a,largest,n); } return 0;}int heapSort(int *a,int n){ int i; int temp; //建堆 for(i=n/2-1;i>=0;i--) { maxHeapify(a,i,n); } //堆排序 for(i=n-1;i>0;i--) { temp=a[0]; a[0]=a[i]; a[i]=temp; maxHeapify(a,0,i); } return 0;}int main(){ int i; int a[10]={14,16,3,4,7,2,8,9,1,10}; heapSort(a,10); for(i=0;i<10;i++) { printf("%d\n",a[i]); } return 0;}
4.优先队列的实现
优先级队列是一种维护由一组元素构成的集合S的数据结构,这一组元素中的每一个都有一个关键字key。一个最大优先级队列支持以下操作:
insert(S,x):把元素x插入集合S。这一操作可写为S=S ∪ {x};
maximum(S):返回S中具有最大关键字的元素;
extract-max(S):去掉并返回S中的具有最大关键字的元素;
increase-key(S,x,k):将元素x的关键字的值增加到k,这里k值不能小于x的原始关键字的值
- 栈+队列+优先队列-总结
- 优先队列总结
- STL中的优先队列总结
- 学习总结_STL_优先队列
- 算法导论 第六章优先队列总结
- priority_queue(优先队列)用法总结
- 我个人总结的优先队列
- priority_queue(优先队列)用法总结
- priority_queue(优先队列)用法总结
- 优先队列(下次总结完整)
- C++中的队列(queue)和优先队列(priority_queue)总结
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- App Framework $.ui.loadContent 参数解释
- ArcGIS教程:创建最小成本廊道
- 关于iOS去除数组中重复数据的几种方法
- linux教程:[4]配置Tomcat开机启动
- mybatis日志打印
- 优先队列总结
- Android setTextSize
- 把cocostudio帧动画添加到物理世界
- Linux下Tomcat内存溢出
- Mysql如何查询连续的时间次数
- Legacy Animation Can’t Animate Material Property
- MYSQL添加远程用户或允许远程访问三种方法
- hdoj Moving Tables 1050 (DP) 坑!坑!坑!
- usb can广成牌品牌提供专业的usb can分析仪