ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

使用C++优先队列(priority_queue)解决Top K问题

2021-07-31 23:34:28  阅读:191  来源: 互联网

标签:pq 优先级 队列 Top C++ queue num pair


#### 背景
在同构的n个数据中取Top K的最大值或者最小值有很多方法,例如:
- 排序后,取前K个或者后K个,算法复杂度为nlog(n);
- 维护大小为K的最大(小)堆,最后取堆中的元素,算法 复杂度为nlog(k)。
当n很大时,第二种方法可以得到显著的速度提升。本文以C++保准库提供的priotiry_queue为基础,实现基于堆的Top K算法。

#### 步骤
1. 创建有限队列
```
//自定义结构的比较器,这里为优先级队列实现一个Great比较器,使优先级队列元素从小到大跑得了排序
struct cmpPairSecondFloatGreat{
    bool operator() (const std::pair<int32_t, float>&a, const std::pair<int32_t, float>& b) {
        return a.second > b.second;
    }
};
//定义优先级队列,队列实现最小堆,即top为最小值。
std::priority_queue<std::pair<int32_t, float>, std::vector<std::pair<int32_t, float>>, cmpPairSecondFloatGreat> noise_words;
```
以取最大Top K为例,将自定义比较器给优先级队列。

2. 更新优先级队列中的值
```
for (int i = 0; i < 100000000; i++) {
    float num = float(rand());
    if (pq.size() < 3){ //以Top 3为例
      pq.push(make_pair(0, num));
    } else {
      if( num < pq.top().second) {
        continue;
      } else {
        pq.pop(); // 如果当前值比待插入值大,则将队头元素删除,将当前值插入队列中。
        pq.push(make_pair(1, num));
      }
    }
    vecs.push_back(make_pair(0, num));
  }
```

3. 获取Top K的值
取出有限队列中的值,即得到Top K的值。
```
while (!pq.empty()) {
    cout << pq.top().second << " ";
    pq.pop();
  }
```
#### 总结
通过有限队列内部实现的堆算法,手动控制有限队列的大小,即可模拟实现基于最大(小)堆的Top K算法。

标签:pq,优先级,队列,Top,C++,queue,num,pair
来源: https://www.cnblogs.com/ledao/p/15085634.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有