2.5.2 优先队列
1.时间复杂度:最小堆
n个结点的完全二叉树(堆是完全二叉树)的深度为h(根的深度为1),则h和n之间满足 2^(h-2) <n <= 2^h,h近似等于log(n)+1。
从代码的直观来看,每次调整一个结点需要log(n),一共调整(n-1)/2个结点,故时间复杂度为O(nlogn),但要注意在中间过程中第s层的结点往下调整时实际只需最多调整(h-s)次,第s层一共调整2^(s-1)*(h-s),这样时间复杂度可写成:
所以优先队列的构建时间为线性的。
2.功能:自动排序(默认从大到小)
3.头文件:
#include<queue>
4.声明:
priority_queue<类型> q;
5.操作:(注意和queue比 没有front和back操作)
q.size();//返回q里元素个数 q.empty();//返回q是否为空,空则返回1,否则返回0 q.push(k);//在q的末尾插入k q.pop();//删掉q的第一个元素 q.top();//返回q的第一个元素
6.优先队列中使用结构体:(操作符重载)
struct Time{ int start; bool operator < (const Time& t)const{ return start > t.start; } };
注意参数列表中的 const 不能少;
7.自定义排序:
从小到大:
priority_queue<int,vector<int>,greater<int> >q1; //从大到小排序,最后两个> >中间必须要用空格
第二个参数为容器类型;
第三个参数为比较函数。
参考1:http://blog.csdn.net/ac_gibson/article/details/44200411
参考2:http://www.cppblog.com/shyli/archive/2007/04/06/21366.html
人生不如意的时候,是上帝给的长假,这个时候应该好好享受假期。
突然有一天假期结束,时来运转,人生才是真正开始了。
突然有一天假期结束,时来运转,人生才是真正开始了。