顾名思义,TOP k就是从海量的数据中选取最大的k个元素或记录。基本思想就是维护一个具有k个元素的小顶堆。每当有新的元素加入时,判断它是否大于堆顶元素,如果大于,用该元素代替堆顶元素,并重新维护小顶堆,直到所有元素被处理完毕。时间复杂度为O(N*logk),基本达到线性复杂度。部分代码如下:
为了便于测试,可以利用随机数函数构造测试用例。鉴于一切从简,我就不多说了。
PS:顺便贴出一个小顶堆和大顶堆的图片
//打印数组元素 void print(int data[], int length) { for(int i = 1; i <= length; ++i) cout << data[i] << " "; cout << endl; } //维护小顶堆 void modifySmallHeap(int data[], int location, int length) { int lchild = 2 * location; int rchild = 2 * location + 1; int smallest; if(lchild <= length && data[lchild] < data[location])smallest = lchild; else smallest = location; if(rchild <= length && data[rchild] < data[smallest])smallest = rchild; if(smallest != location) { swap(data[location], data[smallest]); modifySmallHeap(data, smallest, length); } } //建立小顶堆 void buildSmallHeap(int data[], int length) { for (int i = length / 2; i > 0; --i) { modifySmallHeap(data, i, length); } } //top k算法的简单实现 void HeapSortK(int data[], int length, int topk) { buildSmallHeap(data, topk); for (int i = topk + 1; i <= length; ++i) { if(data[i] <= data[1])continue; else { swap(data[1], data[i]); modifySmallHeap(data, 1, topk); } } } |
PS:顺便贴出一个小顶堆和大顶堆的图片