关于优先队列 priority_queue 的介绍及其应用

缺省情况下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即可;




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值