您的位置:首页 > 理论基础 > 数据结构算法

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

2012-03-27 19:05 309 查看
 用容量为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相关的知识,它其实是一个非常好的库,具有良好的数据结构,而且运行效率也比较的高,是里说应当掌握的重要技术。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐