找出一堆数据中最大或者最小的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相关的知识,它其实是一个非常好的库,具有良好的数据结构,而且运行效率也比较的高,是里说应当掌握的重要技术。
- 找出一堆数据中最大或者最小的K个数
- 找出一堆数据中最大或者最小的K个数
- 找出一堆数据中最小的K个数问题
- 找出一堆数据中最小的K个数问题
- 找出一堆树中最小的k个数
- 找出一堆数中最小的前K个数
- 找出一堆数中最小的前K个数
- 从海量数据中找出最小的k个数
- 找出数组中最小的 K 个数
- 二.用最小堆方法找出海量数据中最小的k个数
- 找出最小的k个数
- 从n个数中,找出最小的k个数
- 找出n个数中最小的k个数
- TOP-K排序算法,从海量不重复数据中找出最大/小的K个数
- N个数中找出最大的K个数
- 100w个数中找出最大的k个数
- 100w个数中找出最大的前k个数
- 100w个数中找出最大的前K个数
- 设备管理系统设计和实现
- 正则表达式全集
- 开关键盘
- 第六周任务三
- delphi ADO连数据库学习实例(初级+高级)
- 找出一堆数据中最大或者最小的K个数
- C语言读取多行字符串,并存入字符数组中
- java 将字符串从右到左每隔三位添加一个逗号
- 浅析BMP位图文件结构(含Demo)(位图读写)【转载】
- 第一天学习java
- js实现页面的重新定向
- SqlPLus简介
- 石子合并问题
- Nachos系统简介