问题描述
在海量的数据中找出最大(最小)的k个数据。
笔记
考虑使用堆。以找出最大的k个数据为例。
建立小顶堆。堆顶元素总是堆里面最小的。
首先从海量数据中拿出k个数据建立堆,调整好堆,此时堆顶元素就是堆里面最小的。
接下来,海量数据一个一个输入,每个数据与堆顶元素比较。
- 如果比堆顶元素小,说明这个数据比整个堆的元素都要小,可以扔掉;
- 如果比堆顶元素大,说明这个元素可以进入堆里。
最后堆里面的元素就是海量数据里最大的k个元素了。
代码中分别使用heap和priority_queue来实现了该功能。
代码
//
// main.cpp
// topk
//
// Created by SteveWong on 8/4/16.
// Copyright © 2016 SteveWong. All rights reserved.
//
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct cmp
{
bool operator () (int a, int b)
{
return a > b;
}
};
int main(int argc, const char * argv[]) {
// insert code here...
std::cout << "Hello, World!\n";
const int k = 10;
const int nbigdata = 100;
vector<int> bigdata;
for (int i = 0; i < nbigdata; i++)
{
bigdata.push_back(i);
}
// 使用priority_queue
priority_queue<int, vector<int>, greater<int>> q;
for (int i = 0; i < k; i++)
{
q.push(bigdata[i]);
}
for (int i = k; i < nbigdata; i++)
{
if (bigdata[i] > q.top())
{
q.pop();
q.push(bigdata[i]);
}
}
// 使用heap
// vector<int> minHeap;
// for (int i = 0; i < k; i++)
// {
// minHeap.push_back(bigdata[i]);
// }
// make_heap(minHeap.begin(), minHeap.end(), cmp());
// for (int i = k; i < nbigdata; i++)
// {
// if (bigdata[i] > minHeap[0])
// {
// pop_heap(minHeap.begin(), minHeap.end(), cmp());
// minHeap.pop_back();
// minHeap.push_back(bigdata[i]);
// push_heap(minHeap.begin(), minHeap.end(), cmp());
// }
// }
return 0;
}
参考
最后参考一下别人怎么做的。