/*
问题:
随机产生100000个整数,范围是【0,1000】,快速统计出值最大的前10个?
*/
#include<iostream>
#include<vector>
#include<queue>
#include<ctime>
#include<functional>
using namespace std;
class TopK{
public:
TopK()
{
srand(time(NULL));//初始化时间种子
for (int i = 0; i < 100000; ++i)
{
v.push_back(rand() % 1000);
}
}
void PrintTopK(int k)
{
priority_queue<int, vector<int>, greater<int>> pri;//小根堆数据结构
//先维持一个k个元素的小根堆
for (int i = 0; i < k; ++i)
{
pri.push(v[i]);
}
//一次遍历往后遍历每个数
for (int i = k; i < v.size(); ++i)
{
if (v[i] > pri.top())//如果比堆顶的大,就将堆顶的元素出堆,将该元素入堆
{//因为堆顶的元素是k个元素中最小的,比堆顶大说明可能TOPK个元素之一
pri.pop();
pri.push(v[i]);
}
}
//遍历一次后,小根堆中的元素都是所有元素中最大的 K个数
for (int i = 0; i < k; ++i)
{
cout << pri.top() << " ";
pri.pop();
}
}
vector<int> v;
};
int main()
{
TopK t;
t.PrintTopK(10);
cin.get();
return 0;
}
TOPK问题----代码实现打印数据中前K大的数
最新推荐文章于 2024-06-24 15:58:46 发布