topK问题解法

topK问题的最佳解法是堆排,下面介绍用堆排来解决该问题。

堆排解决topK问题的思路,取出前K个数,最重要的就是要减少比较的次数,用堆排维护一个K大小的堆,比如一个小顶堆,则堆顶为堆中最小的值,将堆外的元素依次与堆顶比较,若大于堆顶,则与堆顶交换,并将堆重新调整为小顶堆,依次比较完所有元素。则堆顶为堆中的最小元素,且为所有元素中的第K大的元素,则整个堆则为前K大的K个元素。若要取前K个小的数,则要使用大顶堆。
 
测试代码如下:
var array = [10,7,8,6,3,1,5,2,4,9];
var k =6;
var len = array.length;

fHeapSortK(array,len,k);

console.log('topK result: ' + array);

//堆排取出top K数据,小顶堆取最大的前K个数据,大顶堆取最小的前K个数据
function fHeapSortK(data,length,k){
    fBuildSmallHeap(data,k);
    console.log('build ' + data)
    for(var i=k;i<length;i++){
        if(data[i] <= data[0]){
            continue;
        }
        else{
            swap(data,0,i);
            fAdjustSmallHeap(data,0,k-1);
        }
    }
}
//构造小顶堆 function fBuildSmallHeap(data,length){ for(var i = Math.floor(length/2);i--;){ fAdjustSmallHeap(data,i,length); } console.log('small heap ' + data) }
//调整堆为小顶堆 function fAdjustSmallHeap(data,location,length){ var lChild = 2 * location + 1, rChild = 2 * location + 2, 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,smallest); fAdjustSmallHeap(data,smallest,length); } }
//交换数据 function swap(data,a,b){ var temp = data[a]; data[a] = data[b]; data[b] = temp; }

 

转载于:https://www.cnblogs.com/mengff/p/7768085.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值