找出一堆数据中最大或者最小的K个数
来源:互联网 发布:淘宝图片空间怎么导出 编辑:程序博客网 时间:2024/06/09 23:32
转自找出一堆数据中最大或者最小的K个数
用容量为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;
- }
0 0
- 找出一堆数据中最大或者最小的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个数
- Hibernate.initialize(Obj)用法
- 【UI集锦】EasyUI datagrid分页后台查询
- Java中==操作符与equals方法的区别
- hdu 2602 Bone Collector (0-1背包)
- HelloWorld.
- 找出一堆数据中最大或者最小的K个数
- LeetCode 89: Gray Code 格雷码
- mysql数据库常用的系统变量
- 获取map中的所有元素及原理
- C语言利用栈实现将中缀表达式转换为后缀表达式(即逆波兰式)
- R语言包_rCharts
- Java管道Pipe
- Linux ar命令的用法
- uva 1359 poj 3522 Slim Span(最小生成树)