TOP-K问题:即求数据结合中前K个最大的元素或者最小的元素,一般情况下数据量都比较大。
解决办法很简单,比如数组a[ ]的容量n为1000,得到数组a[ ]中前3个最大的元素,那就建小堆,然后push前三个元素,此时HeapTop()是这三个元素中最小的数,再将区域1000-3个元素依次和HeapTop()作比较,如果HeapTop()中元素的值较小,那就Pop出来,再将大的元素Push进去
void PrintTopK(int* a, int n, int k)
{
Hp hp;
HeapInit(&hp);
// 第一步,创建一个k个数的小堆
for (int i = 0; i < k; ++i) {
HeapPush(&hp, a[i]);
}
// 第二步,剩下的n-k个数和堆顶的数据比较,比堆顶大就替换它
for (int i = k; i < n; ++i) {
if (a[i] > HeapTop(&hp)) {
HeapPop(&hp);
HeapPush(&hp, a[i]);
}
}
HeapPrint(&hp);
HeapDestory(&hp);
}