堆排序 VS 快速排序 解决 TOP K 问题
2021-05-30 02:07
标签:根据 air pivot 底层实现 for class 交换 public 实现 c++ STL 中提供了 priority_queue 实现堆的基本功能,比如 priority_queue 堆 pq 的元素都是 int 型的,priority_queue 默认使用 vector 作为 堆的底层实现,pq默认是个 大根对,priority_queue 小根堆 :priority_queue 堆中的元素必须 是可以比较大小的。 Tips : c++ std :: pair 比如找到数组 arr 中的前 k 小个元素,使用快速排序的划分操作 一次可以确定数组中一个元素的最终位置。不断缩小划分的范围, 最终的目标是确定位置 k - 1 上的最终元素。 根据快速排序思想,要是数组的 k -1 位置上的元素确定了,则 [0:k-1] 就是所求的 前 K 小个元素。 求 前 K 大个元素 需使用划分法 确定 n - k 位置上的元素,[n-k,k-1] 就是所求的 前 k 大个元素。 3. 示例 方法一. 快速排序解决 TOP K 问题 方法二. 大根堆解决 TOP K 问题 堆排序 VS 快速排序 解决 TOP K 问题 标签:根据 air pivot 底层实现 for class 交换 public 实现 原文地址:https://www.cnblogs.com/wangxf2019/p/14756010.html解决 TOP k 问题通常可采用 堆排序 和 快速排序的思想
1. 大根堆(前 K 小) / 小根堆(前 K 大): 时间复杂度O(NlogK)
1 templateclass _Ty1, class _Ty2>
2 inline bool operatorconst pair<_ty1 _ty2>& _Left,
3 const pair<_ty1 _ty2>& _Right)
4 { // test if _Left
5 return (_Left.first 6 !(_Right.first _Right.second);
7 }
2 、用快排变形高效解决 TopK 问题:时间复杂度O(N)
注意找前 K 大/前 K 小问题不需要对整个数组进行 O(NlogN)O(NlogN) 的排序!
1 class Solution {
2 public:
3 vector
1 //Top K we
2 class my_less {
3 public:
4 bool operator()(const pairint, int>& pr1, const pairint, int>& pr2) {
5 return pr1.first pr2.first;
6 }
7 };
8
9 class Solution {
10 public:
11 vector
文章标题:堆排序 VS 快速排序 解决 TOP K 问题
文章链接:http://soscw.com/index.php/essay/89366.html