100亿个数中找出最大的前K个数(海量数据topK问题)

分析:海量数据topK问题,在我们日常生活中应用非常广泛,比如微信的计步软件,它就是topK问题,统计出前K名,然后进行排序。那如何解决这个问题呢?我们用堆可以很好的解决这个问题。我们先用前K个数建立一个大堆/小堆(找最大前K个数用小堆,找最小前K个数用大堆,因为:如果找最大前K个数,我们建立一个大堆的话,我们需要用第N-K-1个数与堆顶元素比较,如果它比堆顶元素小我们就要舍弃它,但如果它比堆顶元素小,但比堆中其中一个元素大,我们把它舍弃的话,这样就会排序错误,不能达到目的,但如果我们建立的是小堆的话,堆顶元素是目前堆中最小的元素,如果一个数比堆中最小元素都小的话,那它比这个堆中任一元素都小,舍弃它;找最小的前K个数,建立最大堆也是这个道理),用剩余的N-K个数一一与堆顶也是比较,要么舍弃,要么与堆顶也是交换,再调整堆。
在这里的代码,会用到堆的调整和创建操作,在我们上一篇博客中我有写到,在这里我就直接调用了,如果不懂是话,可以点击这个链接,去看看堆调整和创建堆的代码:https://mp.csdn.net/mdeditor/82346337
代码:
topK.h

#ifnde
  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值