在海量数据中找到最大的前K个数(top K问题)

问题分析:数据是海量的,可能达到10亿或者100亿以上,只需要找最大的前100个数。所以将数据一次性排序然后取前100个是不太可取的操作。做了很多无用功,并且内存一次性也加载不了海量数据。

解决方案:

  1. 方案一:堆。一般说在很多数据中取前多少个数据,我们都会想到,这里我们使用堆来解决问题。首先取K个数建立一个小根堆(堆顶是堆中最小的元素),建堆的时间复杂度是O(KlgK),这个时间复杂度虽然是上界,但不是渐进紧确的,渐进紧确的上界为O(K),具体推导见《算法导论.第三版》P88。接着依次从海量数据(N个数)中拿出一个数据与堆顶元素进行比较,若小于堆顶元素则继续从海量数据中取下一个数,若取出的数比堆顶元素大,则替换堆顶元素,并维护堆的性质,维护堆的性质所需要的时间复杂度是O(lgK)。直到将(N-m)个数遍历完,堆中剩余的数就是N个数的最大前K个数。 故总时间复杂度为O(K+(N-m)lgK) => O(N·lgK)   【N为海量数据,K为要取的最大前K个数。】
  2. 方案二:分块。面对大量数据时,分块也是比较容易想到的解决方法。假设将海量数据分成1000块,然后在每块中找到最大的前K个数。然后再从1000·K个数中直到最大的前K个数。
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值