优先队列是一种常见的数据结构
应用
1、堆排序
它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。
2、哈夫曼编码
哈夫曼编码(Huffman Coding)是一种编码方式,哈夫曼编码是可变编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码。
使用
定义
大根堆(默认)
priority_queue <int> pq;
小根堆
priority_queue <int, vector<int>, greater<int> > pq;
常见函数
empty();//是否为空
size();//有效元素个数
front();//获取第一个
push_back();//从尾部插入元素
pop_back();//删除尾部元素
实战
1、合并果子
P1090
priority_queue<int,vector<int>,greater<int>>q;
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
q.push(x);
}
while(q.size()>1){
x=q.pop();
q.pop();
x+=q.top();
q.pop();
ans+=x;
q.push(x);
}
cout<<ans;
return 0;
思路
每次取最小的两堆,合到一块再进堆底,如此往复,直到合成一堆
2、股票
给定几天股票价格,使得利益最大化,每天可买可卖可不买不卖(最多交易一股)
priority_queue<int ,vector<int>,greater<int>>q;
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
if(!q.empty()){
if(x>q.pop()){
ans+=x-q.top();
q.pop();
q.push(x);
}
}
q.push(x);
}
cout<<ans;
思路
只要今天的比堆中最小的贵就卖,为了防止后面赚得更多,顺便把今天的入堆,卖出的时候结果一样,只不过在过程中分了两段。
重载运算符
friend 返回类型 operator 运算符(参数){
函数体;
};