缺省情况下priority_queue 是一个 max_heap(最大堆);
1,头文件
#include <queue>
2,声明
标准库默认使用元素类型的<操作符来确定元素之间的优先级关系,声明方式为(以int 型为例):
int ia[9] = {0, 1, 2, 3, 4, 8, 9, 3, 5};
priority_queue<int> ipq(ia, ia+9);
ipq为最大堆, ipq.top()等于9.
若想声明一个最小堆,声明方式为:
priority_queue<int, vector<int>, greater<int> > iqp(ia, ia+9);
iqp为最小堆,iqp.top()等于0.
以上两种priority_queue 常用于解决Top K 最小、最大问题。
3,求解“一个N个整数的序列,求其中出现频数最大的K个数”, 这是Top K问题的变种
(1) 定义一个map<int, int>, 统计元素出现次数;
map<int, int> data;
for (int i = 0; i < n; i++)
data[A[i]]++;
(2)自定义一个priority_queue,元素类型为结构体;
struct Count
{
int key, value;
Count(int k, int v):key(k), value(v){}
friend bool operator <(Count c1, Count c2) // 声明为友元函数,重载 operaotr <();
{
return c1.value < c2.value;
}
};
priority_queue<Count> cpq;
(3) 将data中的pair 插入到cpq中;
for(int i = 0; i < data.size(); i++)
{
if (i < k)
cpq.push(Count(data[i].first, data[i].second));
else
{
if (cpq.top() < <span style="font-family: Arial, Helvetica, sans-serif;">Count(data[i].first, data[i].second) </span>)
{
cpq.pop();
cpq.push(Count(data[i].first, data[i].second));
}
}
}
(4) 最后按序输出cpq中全部K个元素的key即可;