参考文章
优先队列
应用
首先优先队列是由堆来实现的,所以以后用到优先队列的地方,可以直接用C++中的STL来直接实现,但是最好还是自己实现几次,否则我们只会成为傻瓜,什么东西就知道怎么用,不知道是如何实现的。
优先队列适用的范围很广,比如:
构造哈夫曼编码
构造哈夫曼编码是找到节点集合中频率最小的两个点,然后合并节点在插入到集合中,再循环。。。一些任务调度算法
比如操作系统的线程的调度算法,有的是按照优先级来调度的,每次都执行优先级较高的线程合并n个有序文件为一个有序文件
首先把n个有序文件的第一个元素取出来,放到优先队列里面,然后取最小值,然后再插入元素导优先队列,取最小值。。。由于优先队列内部是由堆实现的,所以适用于堆的都适用于优先队列
比如排序,找中位数,找最大的k个数
priority_queue的用法
#include <iostream>
#include <queue>
using namespace std;
int main(){
priority_queue<int> q;
for( int i= 0; i< 10; ++i ) q.push( rand() );
while( !q.empty() ){
cout << q.top() << endl;
q.pop();
}
getchar();
return 0;
}
prioruty_queue默认的是大的元素在队头(大顶堆),如果要用小顶堆,则应该填上缺省的参数。
优先队列与堆的对应操作
优先队列 | 堆 |
---|---|
入队 | 在堆的底部插入并调整 |
出队 | 在堆的顶部取出元素 |
堆
建立堆
make_heap(_First, _Last, _Comp)
默认是建立最大堆的。对int类型,可以在第三个参数传入greater()得到最小堆。
在堆中添加数据
push_heap (_First, _Last)
要先在容器中加入数据,再调用push_heap ()
在堆中删除数据
pop_heap(_First, _Last)
要先调用pop_heap()再在容器中删除数据
堆排序
sort_heap(_First, _Last)
排序之后就不再是一个合法的heap了