美文网首页
TOP k问题

TOP k问题

作者: 棉花糖7 | 来源:发表于2021-03-31 18:03 被阅读0次

(1) 最小堆方法

#include

using namespace std;

void heap_adjust(vector&nums,int i, int len) {

       //建立小顶堆,以i节点为根,堆大小为len+1

       intminid = i;

       intleft = i * 2 + 1;

       intright = left + 1;

       if(left <= len && nums[left] < nums[minid])    minid = left;

       if(right <= len && nums[right] < nums[minid])      minid = right;

       if(minid != i) {

              swap(nums[i],nums[minid]);//找到最小值,进行交换

              heap_adjust(nums,minid, len);//递归调整以minid为根的堆

       }

}

vectortopk(vector&nums, int k) {

       //建一个大小为k的堆

       for(int i = k - 1; i >= 0; i--) {

              heap_adjust(nums,i, k - 1);

       }

       for(int j = nums.size() - 1; j >= k; j--) {

              if(nums[j] > nums[0]) {//如果nums[j]比堆顶元素nums[0]小,则不需要改变原来的堆 

                     //如果nums[j]比堆顶元素nums[0]大,那么用nums[j]替换堆顶元素nums[0],在替换之后,需要调整堆来维持最小堆的性质 

                     swap(nums[0],nums[j]);

                     heap_adjust(nums,0, k - 1);

              }

       }

       vectorres(nums.begin(),nums.begin() + k);

       returnres;

}

(2)快排

int partition(vector&nums,int left, int right) {

       intpivot = left + rand() % (right - left + 1);

       swap(nums[pivot],nums[left]);

       inttmp = nums[left];

       while(left < right) {

              while(left < right && nums[right] < tmp) {

                     right--;

              }

              nums[left]= nums[right];//从后往前第一个大于tmp的值

              while(left= tmp) {

                     left++;

              }

              nums[right]= nums[left];//从前往后第一个小于tmp的值

       }

       nums[left]= tmp;//left前的都大于nums[left],left后的都小于nums[left]

       returnleft;

}

vectorquicksort(vector&nums,int left, int right, int k) {

       intpos = partition(nums, left, right);

       if(pos == k) {

              vectorres(nums.begin(),nums.begin() + k + 1);

              returnres;

       }

       elseif (pos < k) {

              returnquicksort(nums, pos + 1, right, k);

       }

       else{

              returnquicksort(nums, left, pos - 1, k);

       }

}

int main() {

       vectornums{15,6,7,8,8,10,16,12,13,14 };

       intk = 4;

       vectorres= quicksort(nums, 0, nums.size() - 1, k - 1);

       system("pause");

       return0;

}

相关文章

  • top K问题

    问题:海量数据处理 - 10亿个数中找出最大的10000个数。解决方案:先拿10000个数建堆,然后一次添加剩余元...

  • Top K问题

    新文集等待补充

  • Top K 问题

    问题描述 有N(N>>10000)个整数,求出其中的前K个最大的数。 问题分析 需要前K个最大数,一定会有比较的过...

  • Top K 问题

  • Top K问题

    参考网站 在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第...

  • TOP k问题

    (1) 最小堆方法 #include using namespace std; void heap_adjust(...

  • BFPTR算法-求TOP-K问题

    BFPTR算法-求TOP-K问题 求TOP-K问题最简单的方式为快速排序后取前K大的即可。但是这样做有两个问题 快...

  • JavaScript BFPRT 算法

    BFPRT 算法 背景 在一组数中求其前 k 小的数,简称TOP-K问题。而目前解决TOP-K问题最有效的算法即是...

  • Top K问题——Parition算法

    Top K问题概述 在非海量数据的情况下,Top K问题的首推解法就是快排中的Parition算法。不仅平均时间复...

  • 必考算法之 Top K 问题

    大家好,这里是《齐姐聊算法》系列之 Top K 问题。 Top K 问题是面试中非常常考的算法题。 Leetcod...

网友评论

      本文标题:TOP k问题

      本文链接:https://www.haomeiwen.com/subject/pydahltx.html