1 亿个数据取出最大前 100 个有什么方法?

2023-12-10 10:45

本文主要是介绍1 亿个数据取出最大前 100 个有什么方法?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 亿个数据取出最大前 100 个有什么方法?

大家好,这是一道经常在面试中被遇到的一个问题,我之前面试也是被问到过得,现在一起学习下,下次再被问到就可以轻松地用对。

在计算机科学和数据处理领域,我们经常会遇到需要从海量的数据中找出最大或最小的若干个元素的情况。本文将以 Java 为例,介绍几种从 1 亿个数据中取出最大前 100 个的方法。

方法一:排序后取前 100 个

最直观的方法是先将这 1 亿个数据排序,然后取排序后的前 100 个。在 Java 中,可以使用 Arrays 类的 sort 方法或者 PriorityQueue 类来实现。

  1. 示例:使用 Arrays.sort()
import java.util.Arrays;
public class Main {public static void main(String[] args) {int[] data = generateData(100000000);Arrays.sort(data);int[] top100 = new int[100];System.arraycopy(data, 0, top100, 0, 100);// 输出最大前 100 个数for (int num : top100) {System.out.print(num + " ");}}public static int[] generateData(int size) {int[] data = new int[size];for (int i = 0; i < size; i++) {data[i] = (int) (Math.random() * 100000000);}return data;}
}
  1. 示例:使用 PriorityQueue
import java.util.PriorityQueue;
public class Main {public static void main(String[] args) {int[] data = generateData(100000000);PriorityQueue<Integer> pq = new PriorityQueue<>(100000000, (a, b) -> b - a);for (int num : data) {pq.offer(num);if (pq.size() > 100) {pq.poll();}}int[] top100 = new int[100];while (!pq.isEmpty()) {top100[pq.size() - 1] = pq.poll();}// 输出最大前 100 个数for (int num : top100) {System.out.print(num + " ");}}public static int[] generateData(int size) {int[] data = new int[size];for (int i = 0; i < size; i++) {data[i] = (int) (Math.random() * 100000000);}return data;}
}

优缺点
• 优点:简单易懂,代码实现容易。
• 缺点:时间复杂度较高,对于大数据量来说,排序所需的时间可能会很长。

方法二:使用部分排序算法

部分排序算法(如快速选择算法)可以在不需要完全排序的情况下找到第 k 大的元素。我们可以使用这个算法来找出最大前 100 个元素。

  1. 示例:使用快速选择算法
import java.util.Random;
public class Main {public static void main(String[] args) {int[] data = generateData(100000000);int[] top100 = findTop100(data);// 输出最大前 100 个数for (int num : top100) {System.out.print(num + " ");}}public static int[] findTop100(int[] data) {int[] result = new int[100];int left = 0;int right = data.length - 1;for (int i = 0; i < 100; i++) {int pivot = data[(left + right) / 2];int leftCount = 0;int rightCount = data.length - 1 - i;for (int num : data) {if (num > pivot) {rightCount--;} else {leftCount++;}}if (leftCount > rightCount) {right = (left + right) / 2;} else {left = (left + right) / 2 + 1;}result[i] = pivot;}return result;}public static int[] generateData(int size) {int[] data = new int[size];for (int i = 0; i < size; i++) {data[i] = (int) (Math.random() * 100000000);}return data;}
}

优缺点
• 优点:时间复杂度较低,对于大数据量来说,效率更高。
• 缺点:代码实现相对复杂,需要理解快速选择算法的原理。 以上就是从 1 亿个数据中取出最大前 100 个的几种方法,各有优缺点,可以根据实际情况选择合适的方法。

今天的分享就到这里,如果觉得对你有帮助,感谢点赞、分享、关注一波,你的认可是我创造的最大动力。

更多内容请关注公众号:程序猿漠然,一个分享有趣后端知识的公众号。

这篇关于1 亿个数据取出最大前 100 个有什么方法?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/476884

相关文章

PyTorch核心方法之state_dict()、parameters()参数打印与应用案例

《PyTorch核心方法之state_dict()、parameters()参数打印与应用案例》PyTorch是一个流行的开源深度学习框架,提供了灵活且高效的方式来训练和部署神经网络,这篇文章主要介绍... 目录前言模型案例A. state_dict()方法验证B. parameters()C. 模型结构冻

Python在二进制文件中进行数据搜索的实战指南

《Python在二进制文件中进行数据搜索的实战指南》在二进制文件中搜索特定数据是编程中常见的任务,尤其在日志分析、程序调试和二进制数据处理中尤为重要,下面我们就来看看如何使用Python实现这一功能吧... 目录简介1. 二进制文件搜索概述2. python二进制模式文件读取(rb)2.1 二进制模式与文本

Python字符串处理方法超全攻略

《Python字符串处理方法超全攻略》字符串可以看作多个字符的按照先后顺序组合,相当于就是序列结构,意味着可以对它进行遍历、切片,:本文主要介绍Python字符串处理方法的相关资料,文中通过代码介... 目录一、基础知识:字符串的“不可变”特性与创建方式二、常用操作:80%场景的“万能工具箱”三、格式化方法

springboot+redis实现订单过期(超时取消)功能的方法详解

《springboot+redis实现订单过期(超时取消)功能的方法详解》在SpringBoot中使用Redis实现订单过期(超时取消)功能,有多种成熟方案,本文为大家整理了几个详细方法,文中的示例代... 目录一、Redis键过期回调方案(推荐)1. 配置Redis监听器2. 监听键过期事件3. Redi

基于SpringBoot实现分布式锁的三种方法

《基于SpringBoot实现分布式锁的三种方法》这篇文章主要为大家详细介绍了基于SpringBoot实现分布式锁的三种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、基于Redis原生命令实现分布式锁1. 基础版Redis分布式锁2. 可重入锁实现二、使用Redisso

C#实现将XML数据自动化地写入Excel文件

《C#实现将XML数据自动化地写入Excel文件》在现代企业级应用中,数据处理与报表生成是核心环节,本文将深入探讨如何利用C#和一款优秀的库,将XML数据自动化地写入Excel文件,有需要的小伙伴可以... 目录理解XML数据结构与Excel的对应关系引入高效工具:使用Spire.XLS for .NETC

自定义注解SpringBoot防重复提交AOP方法详解

《自定义注解SpringBoot防重复提交AOP方法详解》该文章描述了一个防止重复提交的流程,通过HttpServletRequest对象获取请求信息,生成唯一标识,使用Redis分布式锁判断请求是否... 目录防重复提交流程引入依赖properties配置自定义注解切面Redis工具类controller

Java调用DeepSeek API的8个高频坑与解决方法

《Java调用DeepSeekAPI的8个高频坑与解决方法》现在大模型开发特别火,DeepSeek因为中文理解好、反应快、还便宜,不少Java开发者都用它,本文整理了最常踩的8个坑,希望对... 目录引言一、坑 1:Token 过期未处理,鉴权异常引发服务中断问题本质典型错误代码解决方案:实现 Token

Nginx 访问控制的多种方法

《Nginx访问控制的多种方法》本文系统介绍了Nginx实现Web访问控制的多种方法,包括IP黑白名单、路径/方法/参数控制、HTTP基本认证、防盗链机制、客户端证书校验、限速限流、地理位置控制等基... 目录一、IP 白名单与黑名单1. 允许/拒绝指定IP2. 全局黑名单二、基于路径、方法、参数的访问控制

Python中Request的安装以及简单的使用方法图文教程

《Python中Request的安装以及简单的使用方法图文教程》python里的request库经常被用于进行网络爬虫,想要学习网络爬虫的同学必须得安装request这个第三方库,:本文主要介绍P... 目录1.Requests 安装cmd 窗口安装为pycharm安装在pycharm设置中为项目安装req