最近在刷算法题的时候遇到了需要使用堆来解决的问题(尤其是TOP k 问题),所以想把这些方法总结一下,防止后面忘记了还得到处找资料。希望能帮助到大家
参考链接1
参考链接2
对通常是一个可以被看做一棵树的数组对象,满足两个条件:1,堆中的某个结点的值总是不大于或者不小于其父结点的值 2,堆是一颗完全二叉树
根结点最大的数叫做大根堆,最小的叫做小根堆。
堆排序中建堆的时间复杂度为O(n)
在C++ STL中没有堆的数据结构,所以借助其中的 priority_queue(默认是大根堆)
常用的方法如下:
priority_queue, 优先队列,默认是大根堆
size()
empty()
push() 插入一个元素
top() 返回堆顶元素
pop() 弹出堆顶元素
定义成小根堆的方式:priority_queue<int, vector<int>, greater<int>> q;
//升序队列
priority_queue <int,vector<int>,greater<int> > q;
//降序队列
priority_queue <int,vector<int>,less<int> >q;
//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。
//其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)
auto cmp = [](pair<int, int> left, pair<int, int> right) -> bool { return left.second > right.second; };
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> pri_que(cmp);
class mycomparison {
public:
bool operator()(const pair<int, int>& left, const pair<int, int>& right) {
return left.second > right.second;
}
};
priority_queue<pair<int,int>,vector<pair<int, int>>,mycomparison> pri_que2;
struct tmp1 //运算符重载<
{
int x;
tmp1(int a) {x = a;}
bool operator<(const tmp1& a) const
{
return x < a.x; //大顶堆
}
}
priority_queue<tmp1> pri_que3;