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)。

思路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个最大的数

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一种示例代码: ``` import java.util.PriorityQueue; public class Top100Elements { public static void main(String[] args) { int[] data = new int[100000000]; // 假设data数组已经被初始化并赋值 PriorityQueue<Integer> top100 = new PriorityQueue<>(100, (a, b) -> b - a); for (int i : data) { if (top100.size() < 100) { top100.offer(i); } else if (i > top100.peek()) { top100.poll(); top100.offer(i); } } while (!top100.isEmpty()) { System.out.println(top100.poll()); } } } ``` 这段代码使用了`java.util.PriorityQueue`类,该类实现了一个优先队列,每次弹出的元素都是队列最小的元素。我们通过在创建PriorityQueue对象时传入一个Comparator对象来修改元素的比较规则,使得每次弹出的都是队列最大的元素。在遍历数组时,如果优先队列元素数量小于100,则直接将元素加入队列;否则,如果当前遍历到的元素比队列顶部的元素大,则弹出队列顶部的元素并将当前元素加入队列,这样就可以维护队列始终是最大100个数。最后,遍历优先队列,每次弹出元素即可得到最终的100最大的数。 ### 回答2: 要在100亿数据找出最大的一百个,可以使用堆排序算法实现。堆排序利用了堆的性质,能够以时间复杂度O(nlogn)找到最大的一百个数。 首先,我们创建一个大小为一百的最小堆,并将堆的元素初始化为前一百个数据。然后,对于剩余的数据进行遍历,如果当前数据大于堆顶元素,则将堆顶元素替换为当前数据,并进行堆调整,以保证最小堆的性质依然成立。 接着,继续遍历剩余的数据,重复上述操作,直至遍历完成。最终,堆的元素即为100亿数据最大的一百个数。 下面是相应的Java代码示例: ```java import java.util.PriorityQueue; public class FindTop100 { public static void main(String[] args) { long[] data = new long[1000000000]; // 100亿数据,这里假设使用long类型 // 假设数据已经初始化完毕 PriorityQueue<Long> minHeap = new PriorityQueue<>(100); // 创建大小为一百的最小堆 for (int i = 0; i < 100; i++) { minHeap.offer(data[i]); // 初始化堆 } for (int i = 100; i < data.length; i++) { if (data[i] > minHeap.peek()) { minHeap.poll(); minHeap.offer(data[i]); } } // 输出最大的一百个数 while (!minHeap.isEmpty()) { System.out.println(minHeap.poll()); } } } ``` 通过以上代码,我们可以在100亿数据找到最大的一百个数,并按从大到小的顺序输出。 ### 回答3: 要解决这个问题,可以使用Java最大数据结构来实现。下面是一段示例代码,用于找出给定100亿个数最大一百个数字: ```java import java.util.PriorityQueue; public class FindLargestNumbers { public static void main(String[] args) { // 模拟100亿个数字的输入,在这里假设为一个100亿长度的数组,命名为inputArray long[] inputArray = new long[(int)1e10]; // 创建一个最大堆,用于保存当前最大的一百个数字 PriorityQueue<Long> maxHeap = new PriorityQueue<>(100, (a, b) -> b.compareTo(a)); // 遍历输入数组,将数字插入到最大 for (int i = 0; i < inputArray.length; i++) { maxHeap.add(inputArray[i]); // 一旦堆的大小超过100,删除堆顶元素 if (maxHeap.size() > 100) { maxHeap.poll(); } } // 最后,堆保存的就是最大的一百个数字 System.out.println("最大的一百个数字为:"); while (!maxHeap.isEmpty()) { System.out.println(maxHeap.poll()); } } } ``` 以上代码使用了一个最大堆来保存当前最大的一百个数字,并在遍历输入数组时动态维护这个堆。由于最大堆的大小限制为100,因此堆的数字始终保持最大的一百个。遍历结束后,最大保存的就是最大的一百个数字。最后,通过循环打印最大的元素,即可得到最大的一百个数字。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值