找出一堆数据中最大或者最小的K个数
2012-03-27 19:05
309 查看
用容量为K的最小堆来存储最大的K个数,最小堆的堆顶元素就是最大K个数中最小的一个。每次考虑一个新的元素时,将其与堆顶的元素进行比较,只有当它大于堆顶元素时,才用其替换堆顶元素,并更新最小堆。时间复杂度为O(N*logK)。
找出最大的K个数方法是建立一个有K个数的最小堆。
同理:找出最小的K个数方法是建立一个有K个数的最大堆。
小结:通过学习STL相关的知识,它其实是一个非常好的库,具有良好的数据结构,而且运行效率也比较的高,是里说应当掌握的重要技术。
找出最大的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个数
- 从大量的数据中找出若干个最大或者最小的数据
- 通过循环找出一组数据的最大值和最小值的小技巧
- tsql 从数据表中找出缺失的最大、最小ID值。
- 找出数据集合中的最小值和最大值的两种算法比较
- mysql 多种方式 获得 最大或者最小的一条数据
- 10000亿数据寻找 最大 或者最小 n个 数 各种算法比较
- python 找出list中最大或者最小几个数的索引
- 一是关于怎样找出和去除重复数据,这在另一个帖子利已有详细介绍。二是关于找出某一列里最大或最小的前几个,或是大于或小于某一个值(最大值或平均值)的数据
- 通过随机数生成办法,向int num[10][10]的数组 中存入数据并找出数组的最大、最小值及其下标。
- 在N个数中找出其中最大的或者最小的K个数
- 数据结构第5章例题 若矩阵Am×n中存在某个元素aij满足:aij是第i行中的最小值且是第j列中的最大值,则称该元素为矩阵A的一个鞍点。试编写一个算法,找出A中的所有鞍点。
- python 找出list中最大或者最小几个数的索引方法
- 找出一堆数据中最小的K个数问题
- 有n枚硬币按照0到n-1对它们进行编号,其中编号为i的硬币面额为vi,两个人轮流从剩下硬币中取出一枚硬币归自己所有,但每次取硬币的时候只能取剩下的硬币中编号最小的硬币或者编号最大的硬币,在两个都采用最
- poj 1797 一条路径中的最小边 再找出最大的
- 找出一个二维数组中的“鞍点”,即该位置上的元素在该行中最大,在该列中最小(也可能没鞍点),打印出有关信息。
- R语言数据最大最小归一化
- 找出两个int型变量的最大值和最小值,不使用if/:?/switch判断语句
- JAVA笔试面试之使用堆排对大量数据进行筛选最大或最小