算法复习:topK问题
维护一个小根堆寻找最大的K个元素,不会改变存储空间的内容,时间复杂度o(nlogK),空间复杂度o(K)
0903加,一种优化方法:维护一个K个值的小顶堆,每次发现堆外值大于堆顶,就把堆顶替换成这个大值,重新维护堆平衡,直到最后,这个堆就是topk
multiset<int,less<int>>维护一个小根堆
multiset<int,greater<int>>维护一个大根堆
multiset<int>默认维护小根堆
#include<iostream> #include<vector> #include<string> #include<stdlib.h> #include<set> #include<map> using namespace std; #define MAX 999999 vector<int> get_TopK(vector<int>&nums,int K) { if(nums.size()<=K||K==0) return nums; multiset<int,less<int> >mybag; multiset<int,less<int> >::iterator it; vector<int> result; for(int i=0;i<nums.size();i++) { if(mybag.size()<K) mybag.insert(nums[i]); else { it=mybag.begin(); if(*it<nums[i]) { mybag.erase(it); mybag.insert(nums[i]); } } } for(it=mybag.begin();it!=mybag.end();it++) { result.push_back(*it); } return result; } int main() { int K,number; cin>>K>>number; vector<int>nums; for(int i=0;i<number;i++) { int tmp=0; cin>>tmp; nums.push_back(tmp); } vector<int>tmp=get_TopK(nums,K); for(int i=K-1;i>=0;i--) cout<<tmp[i]<<" "; cout<<endl; return 0; } /* 5 11 1 3 5 2 7 9 11 3 4 6 8 */