100万个数据里面找出100个最大的

这篇博客介绍了如何在大量数据(如100万)中,通过堆数据结构有效地找出前100个最大值。在使用Eclipse运行时,可能会遇到内存不足的问题,解决方法是在RunAs的VmArguments中设置-Xmx800m增加内存限制。
摘要由CSDN通过智能技术生成

参考博客:

https://blog.csdn.net/beiyetengqing/article/details/8011792

/*基于quicksort实现的原理如下:

1. 假设数组为 array[N] (N = 1 亿),首先利用quicksort的原理把array分成两个部分,左边部分比 array[N - 1] (array中的最后一个值,即pivot) 大, 右边部分比pivot 小。然后,可以得到 array[array.length - 1] (即 pivot) 在整个数组中的位置,假设是 k.
2. 如果 k 比 99 大,原数组变成了 array [0, ...  k - 1], 然后在数组里找前 100 最大值。 (继续递归)
3. 如果 k 比 99 小, 原数组变成了 array [k + 1, ..., N ], 然后在数组里找前 100 - (k + 1) 最大值。(继续递归)
4. 如果 k == 99, 那么数组的前 100 个值一定是最大的。(退出)*/


import java.util.Random;


public class TopHundred {
    public void tophundred(int[] array, int start, int end, int k) {
        
        int switchPointer = start;
        int pivot = array[end]; //array最后一个值作为pivot
        for (int i = start; i < end; i++) {
            if (array[i] >= pivot) {
                swap(array, switchPointer, i);
                switchPointer++;
            }
        }
        swap(array, end, switchPointer);//交换后,array左边的值比pivot大,右边的值比pivot小
        
        if (switchPointer < k - 1) {
   
### 回答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、付费专栏及课程。

余额充值