百万数据处理,找到前K大的数字(TopK问题)。

在处理大量数据并需要找出前K大数字时,由于内存限制不能直接排序。本文介绍了使用小根堆的方法来解决这个问题。通过建立一个容量为K的堆,先存储前K个数据并保持堆有序,然后依次与后续数据比较,更新堆以找到前K大的数字。文章还提供了具体的堆实现和测试过程。
摘要由CSDN通过智能技术生成

假如你有一组数据,现在让你求出前K大的数字。有的人说,直接排序不就Ok了。那么我的问题来了。

如果这个数据很多呢,并且现在给你分配的内存很小,不足以让你开辟足够大的空间去存储数组。我们该怎么办。

这个时候我们就可以用堆来实现。

比如我们现在有300000个随机数字,现在让你找出来前100大的数字。

思路:我们可以建立一个容量为100堆,先将前100个数据存入。将堆变成小根堆,接下来每次从随机数字中取出一个数字,和堆顶的元素比较大小,如果大于堆顶的元素,将堆顶元素替换,在将堆变成小根堆。以此类推,直到所有元素遍历完。

 

堆实现模块


public class TestHeap {
    private final int DEFALUT_SIZE = 10;
    private int[] elem ;

    public TestHeap() {
        this.elem = new int[DEFALUT_SIZE];

    }
    
    public void heapSort(int[] arr){
        int i;
        //先将前k个元素存入堆中
        for(i = 0;i<DEFALUT_SIZE;i++){
            elem[i] = arr[i];
        }
        while(i<arr.length){
            smallHeapSort(arr[i]);
            i++;
        }
        this.show();
    }
    //小根堆实现
    public void smallHeapSort(int a
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值