最小堆可在O(n log k)时间内求解Top K问题,通过维护大小为K的堆保留最大K个元素,C++中利用priority_queue并指定较小值优先的比较器实现最小堆,遍历数组时当堆未满直接插入,否则在当前元素大于堆顶时替换堆顶,最终堆顶即为第K大元素。

在C++中解决Top K问题,最小堆是一种高效的方法,尤其当数据量大、K值相对较小的时候。使用最小堆可以在O(n log k)的时间复杂度内找出最大的K个元素,比排序整个数组更高效。
最小堆是一个完全二叉树,父节点的值小于等于子节点。可以用一个vector来模拟堆结构,通过索引关系维护父子节点:
核心操作包括插入(上浮)和删除堆顶(下沉):
void push(int val) { heap.push_back(val); shiftUp(heap.size() - 1); }维护一个大小为K的最小堆,遍历数组时:
立即学习“C++免费学习笔记(深入)”;
这样最终堆中保存的就是最大的K个数,堆顶是其中最小的,即第K大元素。
int findKthLargest(vectorC++提供了priority_queue,默认是最大堆。要创建最小堆,需指定比较函数:
priority_queue常用接口:
利用这些接口,可以快速实现Top K逻辑,避免手动实现堆操作。
基本上就这些。用最小堆处理Top K问题,关键是控制堆大小为K,只保留较大的元素。结合priority_queue能大幅简化代码,适合面试场景。注意比较器的选择,别把最大堆和最小堆搞反了。
以上就是C++怎么实现一个最小堆来解决Top K问题_C++算法面试与优先队列的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号