【原创】TOP k算法的简单实现

        顾名思义,TOP k就是从海量的数据中选取最大的k个元素或记录。基本思想就是维护一个具有k个元素的小顶堆。每当有新的元素加入时,判断它是否大于堆顶元素,如果大于,用该元素代替堆顶元素,并重新维护小顶堆,直到所有元素被处理完毕。时间复杂度为O(N*logk),基本达到线性复杂度。部分代码如下:
 
//打印数组元素 
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:顺便贴出一个小顶堆和大顶堆的图片
TOP k算法的简单实现 - 哼哈二将 - 尚武思文
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值