仅用10MB内存,你能从100亿个数中找到中位数吗?

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 大家好,我是小米,一名热爱技术分享的程序员。今天探讨如何在内存有限(仅10MB)时找到100亿个整数的中位数。面对庞大的数据量(约400GB)及内存限制,我们将采用分治策略:先依据整数的最高二进制位将数据分为非负数与负数两个文件,逐步缩小范围直至能在内存中处理。当内存充足时,可直接加载所有数据并排序找到中位数。这一问题不仅考验算法能力,也是处理大数据时资源管理的关键。



大家好,我是小米,一个积极活泼的技术分享爱好者!今天,我们来聊聊一个经典的算法问题:如何在内存有限的情况下,找到100亿个整数的中位数。这个问题在大数据处理领域非常常见,特别是在资源受限的情况下,找到有效的解决方案对技术人来说是一种挑战,也是一种乐趣。

问题背景

假设我们有一个大文件,里面包含了100亿个整数。我们只有10MB的内存,要在其中找到中位数。首先,什么是中位数呢?简单来说,中位数就是排序后位于中间位置的那个数。对于100亿个整数来说,中位数就是第50亿个数。

问题的挑战

  • 数据量巨大:100亿个整数可不是小数目,如果每个整数占用4字节,那么100亿个整数需要大约400GB的存储空间。
  • 内存限制:仅有10MB的内存,根本无法一次性载入这些数据。

面对如此大数据量和有限的内存,我们该如何找到中位数呢?别慌,我们一起来看看如何应对这两种情况!

内存够的情况下

如果你有足够的内存,那就简单多了!我们可以一次性将所有数据载入内存,然后进行排序,找到排序后中间位置的那个数即可。哪怕你使用最简单的冒泡排序也可以解决问题。

这个方法虽然简单粗暴,但在实际中几乎不可能,因为面试官不会给你那么多内存!

内存不够的情况下

当内存不够时,我们就得动点脑筋了。我们可以通过“分治”的思想将大问题逐步缩小到内存能够处理的范围。

思路解析

  • 分文件处理:由于我们只关心中位数,所以可以通过二进制的位来将数据分成多个子文件。每次处理一个子文件,缩小范围,直到我们能够找到中位数。
  • 二进制位划分:首先,读取文件中的数据到内存中(不超过10MB),然后根据数字的二进制最高位(第32位,符号位)将数字分成两个文件。如果最高位为0,表示这个数是非负数,则写入file_0文件中;如果最高位为1,表示这个数是负数,则写入file_1文件中。

具体实现

以下是这个过程的Java代码实现:

代码解析

  • 划分文件:通过divideFile方法,我们可以根据指定的二进制位将文件中的数字分成两个文件。这里用的是BufferedReader和BufferedWriter来处理文件IO,以确保效率。
  • 递归查找中位数:findMedianInFile方法中,我们不断缩小范围,直到文件中的数据可以直接在内存中处理(通过排序找出中位数)。

进一步优化

如果文件过大,读取和写入操作可能会成为瓶颈。可以考虑使用更高效的IO方式或者利用多线程并发处理来提升性能。此外,对于非常大的数据集,分布式处理也是一种可行的方案。

END

在解决大数据问题时,内存的限制是必须要考虑的因素。通过分治法,我们能够有效地将问题规模逐步缩小,最终在有限的内存内找到答案。这个思路不仅仅适用于寻找中位数的问题,还可以推广到其他需要处理大数据的场景中。

希望今天的分享对你有所帮助!如果你有任何问题或想法,欢迎在评论区与我交流。让我们一起在算法的世界中探索更多的乐趣吧!

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号软件求生,获取更多技术干货!

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
相关文章
|
4月前
|
存储 Java 开发工具
【Azure 存储服务】Azure Blob上传大文件(600MB)出现内存溢出情况(Java SDK)
【Azure 存储服务】Azure Blob上传大文件(600MB)出现内存溢出情况(Java SDK)
|
2月前
|
监控 算法 应用服务中间件
“四两拨千斤” —— 1.2MB 数据如何吃掉 10GB 内存
一个特殊请求引发服务器内存用量暴涨进而导致进程 OOM 的惨案。
|
存储 NoSQL 架构师
Redis 10亿数据量只需要100MB内存,为什么这么牛?
reids位操作也叫位数组操作、bitmap,它提供了SETBIT、GETBIT、BITCOUNT、BITTOP四个命令用于操作二进制位数组。
|
1月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
298 1
|
24天前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
1月前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
1月前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
22 3

热门文章

最新文章