首页 经验

JAVA 十亿和数找到前100个最大的,堆排序,怎么实现,怎么调整。

时间: 2024-10-21 11:03:37

(部分内容来自网络,其真实性存疑,为了避免对您造成误导,请谨慎甄别。)

在 Java 中,要找到十亿个数中前 100 个最大的数,可以使用堆排序(Heap Sort)或优先队列(Priority Queue)。对于这个问题,使用 最小堆(Min-Heap) 是一种有效的方法,因为我们只需要维护一个大小为 100 的堆来存储当前最大的 100 个数。


以下是如何使用最小堆来实现这个任务的步骤:


实现步骤


1. 初始化一个大小为 100 的最小堆

2. 遍历所有的数

   - 如果当前数大于堆顶(最小的数),则替换堆顶,并重新调整堆。

   - 如果当前数小于堆顶,则跳过这个数。

3. 遍历结束后,最小堆中的元素就是前 100 个最大的数


Java 示例代码


以下是使用 Java 实现上述算法的示例代码:


java

import java.util.PriorityQueue;


public class TopKNumbers {

    public static void main(String[] args) {

        // 假设这是我们从十亿个数中读取的数(仅示例)

        int[] numbers = {/* 这里填充你的数据 */};

        

        // 找到前100个最大的数

        int k = 100;

        int[] topK = findTopK(numbers, k);


        // 输出结果

        for (int num : topK) {

            System.out.println(num);

        }

    }

    

    public static int[] findTopK(int[] nums, int k) {

        // 使用最小堆

        PriorityQueue<Integer> minHeap = new PriorityQueue<>(k);

        

        // 遍历所有数

        for (int num : nums) {

            // 如果堆未满,直接添加

            if (minHeap.size() < k) {

                minHeap.offer(num);

            } else if (num > minHeap.peek()) {

                // 如果堆已满且当前数大于堆顶,则替换堆顶

                minHeap.poll(); // 移除最小的数

                minHeap.offer(num); // 添加当前数

            }

        }

        

        // 提取堆中的元素

        int[] topK = new int[k];

        for (int i = 0; i < k; i++) {

            topK[i] = minHeap.poll();

        }

        

        return topK;

    }

}


说明


- 这个代码段中,我们使用了 PriorityQueue 来实现最小堆。

- offer 方法用于添加元素,poll 方法用于移除堆顶元素。

- 最后,我们将堆中的元素提取出来,得到前 100 个最大数。


请注意,基于内存的限制,这个代码片段假设已在一个合适的环境中运行,需要处理的十亿个数可以通过流式或批量处理等方式读取,而不仅仅是存储在内存中。


上一个 十亿个数的集合和10w个数的集合,如何求它们的交集。集合的数字不重复。 文章列表 下一个 TCP和UDP的区别,具体使用场景呢

最新

工具

© 2019-至今 适观科技

沪ICP备17002269号