首页 > 后端开发 > C++ > 正文

C++怎么实现一个最小堆来解决Top K问题_C++算法面试与优先队列

穿越時空
发布: 2025-11-22 19:33:58
原创
259人浏览过
最小堆可在O(n log k)时间内求解Top K问题,通过维护大小为K的堆保留最大K个元素,C++中利用priority_queue并指定较小值优先的比较器实现最小堆,遍历数组时当堆未满直接插入,否则在当前元素大于堆顶时替换堆顶,最终堆顶即为第K大元素。

c++怎么实现一个最小堆来解决top k问题_c++算法面试与优先队列

在C++中解决Top K问题,最小堆是一种高效的方法,尤其当数据量大、K值相对较小的时候。使用最小堆可以在O(n log k)的时间复杂度内找出最大的K个元素,比排序整个数组更高效。

最小堆的基本实现

最小堆是一个完全二叉树,父节点的值小于等于子节点。可以用一个vector来模拟堆结构,通过索引关系维护父子节点:

  • 父节点索引:(i - 1) / 2
  • 左子节点索引:2 * i + 1
  • 右子节点索引:2 * i + 2

核心操作包括插入(上浮)和删除堆顶(下沉):

void push(int val) { heap.push_back(val); shiftUp(heap.size() - 1); }
void pop() { if (!heap.empty()) { swap(heap[0], heap.back()); heap.pop_back(); shiftDown(0); } }

用最小堆解决Top K最大元素

维护一个大小为K的最小堆,遍历数组时:

立即学习C++免费学习笔记(深入)”;

  • 如果堆未满,直接插入元素
  • 如果堆已满且当前元素大于堆顶,替换堆顶并调整

这样最终堆中保存的就是最大的K个数,堆顶是其中最小的,即第K大元素。

秘塔写作猫
秘塔写作猫

秘塔写作猫是一个集AI写作、校对、润色、配图等为一体的创作平台

秘塔写作猫 127
查看详情 秘塔写作猫
int findKthLargest(vector& nums, int k) {
  priority_queue, greater> minHeap;
  for (int num : nums) {
    if (minHeap.size()
      minHeap.push(num);
    } else if (num > minHeap.top()) {
      minHeap.pop();
      minHeap.push(num);
    }
  }
  return minHeap.top();
}

C++标准库中的优先队列

C++提供了priority_queue,默认是最大堆。要创建最小堆,需指定比较函数:

priority_queue, greater> minHeap;

常用接口:

  • push(x):插入元素
  • pop():删除堆顶
  • top():访问堆顶
  • size():获取堆大小

利用这些接口,可以快速实现Top K逻辑,避免手动实现堆操作。

基本上就这些。用最小堆处理Top K问题,关键是控制堆大小为K,只保留较大的元素。结合priority_queue能大幅简化代码,适合面试场景。注意比较器的选择,别把最大堆和最小堆搞反了。

以上就是C++怎么实现一个最小堆来解决Top K问题_C++算法面试与优先队列的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号