10亿数据中取最大的100个数据

往期精选

    架构师高并发高性能分布式教程(4000G)

  ●  39阶段精品云计算大数据实战****

  ●  互联网技术干货****大全【菜单为准】

  ●  2017年8月最新Intellij IDEA全套****

    程序员如何制作高质量的简历【视频+简历】

  ●  两套大型电商实战项目 

  ●  200本经典编程相关书籍下载

      更多精彩查看历史记录.........

思路1:利用堆排序实现 (尾部相关源码获取方式)
(1)取前m个元素(例如m=100),建立一个小顶堆。保持一个小顶堆得性质的步骤,运行时间为O(lgm);建立一个小顶堆运行时间为m*O(lgm)=O(m lgm); 
(2)顺序读取后续元素,直到结束。每次读取一个元素,如果该元素比堆顶元素小,直接丢弃。如果大于堆顶元素,则用该元素替换堆顶元素,然后保持最小堆性质。最坏情况是每次都需要替换掉堆顶的最小元素,因此需要维护堆的代价为(N-m)*O(lgm);最后这个堆中的元素就是10亿个数据中最大的100个。时间复杂度为O(N lgm)。

10亿数据中取最大的100个数据

10亿数据中取最大的100个数据

10亿数据中取最大的100个数据

思路2:根据快速排序划分的思想 
(1)递归对所有数据分成[a,b)b(b,d]两个区间,(b,d]区间内的数都是大于[a,b)区间内的数 
(2)对(b,d]重复(1)操作,直到最右边的区间个数小于100个。注意[a,b)区间不用划分 
(3)返回上一个区间,并返回此区间的数字数目。接着方法仍然是对上一区间的左边进行划分,分为[a2,b2)b2(b2,d2]两个区间,取(b2,d2]区间。如果个数不够,继续(3)操作,如果个数超过100的就重复1操作,直到最后右边只有100个数为止。

基于该思想,下面的例子中我们将尝试在100个数里面找出10个最大的数

10亿数据中取最大的100个数据

10亿数据中取最大的100个数据

10亿数据中取最大的100个数据

思路3:分块查找 
先把10亿个数分成100份,每份1000w个数,然后在1000w个数中分别找出最大的100个数,最后在100*100个数中找出最大的100个。这里我想可以用分布式的处理,多台主机才会更快。(相关代码回复"10亿"获取)(来源网络

java开发者交流群【点击加入