这几天一直遇到优先队列的题目,刚开始感觉挺难的,但是后面多做了几题,发现,其实简单的说,优先队列就是对一个队列进行排序(时刻), emmm, 本人的资历较浅,可能下面所描述的有所错误,还请见谅与批评指正!
由于C++ 中 就有优先队列这个函数,所以我们直接用就行了:
STL里的优先队列:priority_queue;
如果我们想让这个队列实现从小到大排序,我们可以这样操作:
priority_queue<int, vector<int>, greater<int> > q;? ? // q是队列名~~
如果我们想让这个队列实现从大到小排序,我们可以这样操作:
priority_queue<int, vector<int>, less<int> > q;? ?// q同上!!!
其实我们也可以通过重载运算符实现从大到小的排序功能:
struct Node{
int x,y;
Node(int a=0, int b=0):
x(a), y(b) {}
};
struct cmp{
bool operator()(Node a, Node b){
if(a.x == b.x) return a.y>b.y;
return a.x>b.x;
}
};
priority_queue<Node,vector<Node>,cmp>q;
最后,我想说一下我对于优先队列作用的肤浅的认识:
当我们遇到一个问题,他需要我们一直更新最小值(当然不会是minv = min(minv, XX)那么简单啦!)
比如说,有一组数,我们需要取这组数的最小的两个数a, b,然后我们再输入一个数c,三者之和:a+b+c, 然后我们要把这个和并入数组中,然后重复上述操作~~~
我们可以发现啊,如果我们用平常做法的话,我们需要在求和之和再求这个数组(已经并入和结果)的最小的两个数,那么是不是会很麻烦? 对, 所以这里就体现出优先队列的优越性了!hhh,(语文不太好!可能没说清楚我想说的)
呃,如果后续我有新的体会,我会及时更新的! 欢迎批评指正!
|