找出一堆数据中最大或者最小的K个数

来源:互联网 发布:高性能云计算 编辑:程序博客网 时间:2024/05/19 21:15

 用容量为K的最小堆来存储最大的K个数,最小堆的堆顶元素就是最大K个数中最小的一个。每次考虑一个新的元素时,将其与堆顶的元素进行比较,只有当它大于堆顶元素时,才用其替换堆顶元素,并更新最小堆。时间复杂度为O(N*logK)。


找出最大的K个数方法是建立一个有K个数的最小堆。

#include <iostream>#include <vector>#include <set>using namespace std;typedef multiset< int,less<int> >  INTHEAP;void FindGreatestNum(vector<int>& iArray, const unsigned int num, INTHEAP& pRes){pRes.clear();if(iArray.empty() || num <= 0){return;}vector<int>::iterator iter = iArray.begin();while(iter != iArray.end()){if(pRes.size() < num){pRes.insert(*iter);}else{INTHEAP::iterator pIter = pRes.begin();if(*iter > *pIter){pRes.erase(pIter);pRes.insert(*iter); }}iter ++;}}int main(){int iArray[] = {1,6,9,0,2,8,12,77,90,54,78,92,23,34,56,76,91};int len =  sizeof( iArray ) / sizeof( int );const unsigned int num = 7;vector<int> nArray(iArray, iArray + len);INTHEAP pRes;FindGreatestNum(nArray, num, pRes);INTHEAP::iterator iter = pRes.begin();while(iter != pRes.end()){cout<<*iter<<" ";iter ++;}cout<<endl;return 0;}

同理:找出最小的K个数方法是建立一个有K个数的最大堆。

#include <iostream>#include <set>#include <vector>using namespace std;typedef multiset<int, greater < int > >  intHeap;void FindKLeastNumbers(vector< int >& iArray,const unsigned int num,intHeap& pResult){pResult.clear();if(iArray.empty() || num <= 0){return;}for(vector<int>::iterator iter = iArray.begin(); iter != iArray.end(); iter ++){if(pResult.size() < num){pResult.insert(*iter);}else{multiset<int, greater<int> >::iterator pIter = pResult.begin();if(*iter < *(pResult.begin())){pResult.erase(pIter);pResult.insert(*iter);}}}}int main(){int iArray[]  = {1,9,7,8,5,3,9,4,2};int len = sizeof( iArray ) / sizeof( int );vector< int >  nArray(iArray, iArray + len);const unsigned int num = 4;intHeap pResult;FindKLeastNumbers(nArray, num, pResult);multiset<int, greater<int> >::iterator iter = pResult.begin();while(iter != pResult.end()){cout<<*iter<<" ";iter ++;}cout<<endl;return 0;}

小结:通过学习STL相关的知识,它其实是一个非常好的库,具有良好的数据结构,而且运行效率也比较的高,是里说应当掌握的重要技术。



原创粉丝点击