使用C++优先队列(priority_queue)解决Top K问题
2021/8/1 1:05:56
本文主要是介绍使用C++优先队列(priority_queue)解决Top K问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
#### 背景
在同构的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算法。
这篇关于使用C++优先队列(priority_queue)解决Top K问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-24怎么切换 Git 项目的远程仓库地址?-icode9专业技术文章分享
- 2024-12-24怎么更改 Git 远程仓库的名称?-icode9专业技术文章分享
- 2024-12-24更改 Git 本地分支关联的远程分支是什么命令?-icode9专业技术文章分享
- 2024-12-24uniapp 连接之后会被立马断开是什么原因?-icode9专业技术文章分享
- 2024-12-24cdn 路径可以指定规则映射吗?-icode9专业技术文章分享
- 2024-12-24CAP:Serverless?+AI?让应用开发更简单
- 2024-12-23新能源车企如何通过CRM工具优化客户关系管理,增强客户忠诚度与品牌影响力
- 2024-12-23原创tauri2.1+vite6.0+rust+arco客户端os平台系统|tauri2+rust桌面os管理
- 2024-12-23DevExpress 怎么实现右键菜单(Context Menu)显示中文?-icode9专业技术文章分享
- 2024-12-22怎么通过控制台去看我的页面渲染的内容在哪个文件中呢-icode9专业技术文章分享