海量数据统计通解之 TOP X问题——堆排序在此削铁如泥!

上文讨论了怎么把一大堆数据归纳划分到零碎的文件中,让拥有相同特征的数据之间彼此比较和操作。这篇文章现在就解决让你蛋疼无比的TOP X问题。

首先。什么是TOP X? X是一个数字,比如TOP 10,TOP 100,或者某些数据的第100小,第100大。一个必然的算法就是我给这些数据进行排序,排序完了自然就求出来了。不过这样做带来的一个负面效果就是大量无效的排序结果,比如一个文件里有1000万个数据,我让你求前10,排序之后前10可求,但是后9999990的数据完全没有必要排序啊。 为了解决这个问题,我们使用含有X个元素的堆。

如果你要求最大的X个,则使用X元素的小顶堆,如果你要求最小的X个,则使用X的大顶堆

看到这是不是有人觉得我发烧了,怎么求最大值反而用小顶,求最小值反而用大顶。如果你有这种想法,那么考虑这样的一个情况,假设我们要求TOP 10,于是我们有一个10个元素的小顶堆。 如果第10大的元素位于堆顶,那么说明了什么呢?由于小顶堆中任意元素都大于等于堆顶,于是TOP 10问题就因此解决了。那么,如果第10大现在不在堆顶,则堆内肯定存在元素小于第10大,从而也就还有TOP 10中的成员没有被纳入堆中。这时候我们应该知道,这些小于第10大的元素应该被赶出堆。于是,在这样的思路下,寻找TOP X的元素就出来了:让比堆中最小值大的元素不断地进入堆,这样,小的元素就迟早会变成最小值而被不断地赶出堆,从而留下的元素就是最大的X个元素。


生成一个X的辅助空间。注意:X是常数,因此空间复杂度是O(1)!!!

将数据的最开始X个放入辅助空间,并调整为小顶堆。这些元素有可能有一些是TOP X的成员,有一些不是。在调整完成后,这些元素的最小值位于了堆顶。

扫描X+1位置至数据末尾。

如果当前元素大于堆顶,那么显见,堆顶要被赶出堆。因此用当前元素替换堆顶,并重新调整堆为小顶堆后继续扫描。

在整个算法完成之后,堆内的元素就是TOP X。


由于X是常数,因此调整堆的时间复杂度就是常数,所以这个算法的时间复杂度是O(n)。


求TOP X 小用大顶堆也是同理,大的元素被不断赶出去,小的元素不断进来。

-------------------------------------------我是分割线-------------------------------------------

上面讲了怎么对一个数据文件也好,数据数组也好求TOP 10。在海量数据面前,通常都得分割数据文件。这样,怎么求得整体数据的TOP X呢?

好办,各个分割文件统计TOP X,然后把统计结果整合在一起再统计一个TOP X就行了。

这个我觉得很好理解,因此也就不证明了。





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值