仅用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 
相关文章
|
3月前
|
存储 Java 开发工具
【Azure 存储服务】Azure Blob上传大文件(600MB)出现内存溢出情况(Java SDK)
【Azure 存储服务】Azure Blob上传大文件(600MB)出现内存溢出情况(Java SDK)
|
26天前
|
监控 算法 应用服务中间件
“四两拨千斤” —— 1.2MB 数据如何吃掉 10GB 内存
一个特殊请求引发服务器内存用量暴涨进而导致进程 OOM 的惨案。
|
存储 NoSQL 架构师
Redis 10亿数据量只需要100MB内存,为什么这么牛?
reids位操作也叫位数组操作、bitmap,它提供了SETBIT、GETBIT、BITCOUNT、BITTOP四个命令用于操作二进制位数组。
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
378 0
|
26天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
55 1
|
30天前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
1月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。