大数据中位数怎么运算_大数据查找中位数

前两天同学面试遇到的一道题,大数据怎么找出中位数。大数据 --> 所有数据不能一下子读入内存

中位数 --> 需要遍历所有数据

1. 题目

在一个大文件中有100亿个32位整数,乱序排列,要求找出中位数;内存限制为512M;请写出算法设计思路;

2. 基本知识b --> bit 比特,位(二进制中的位)

B --> Byte 字节,1个字节=8位,1B=8bit

K --> KB 千字节,1KB = 1024B

M --> MB 兆字节,1M = 1024KB = 1024*1024B

G --> GB 1GB = 1024MB

问题分析:

100亿个32位整数,那么占用内存为:100亿*32 b = 100亿*32/8 B = 100亿*32/8/1024 KB = 100亿*32/8/1024/1024 MB = 38146.9727 MB > 512M

所以肯定不能一次全部载入内存。

那么512M可以装多少个32位整数呢?512M=512*1024K=512*1024*1024B=512*1024*1024*8b=4294967296b

可存储32位整数:4294967296b/32b=134217728个,是1亿多个。

3. 设计思路

中位数需要遍历数据才能找出来,512M是我们可用的内存限制,每次只能载入1亿多个数据,100亿个数据,我们可以分成100次进行载入遍历。

那么遍历的时候我们需要记录哪些信息呢,因为要求中位数,我们可以考虑将数据划分区间,计算每个区间我们的数据落进去的数目,就可以大致知道数据分布了。

所以整体的数据区间是多少呢?一个有符号的32位整数,他的取值范围是:

,总共有4294967296个整数值,我们把它划成100000组,那么每组的数据是43000个,最后一组少点。

所以第一个区间

的取值范围是

,第二个区间

的取值范围是

,以此类推。

我们分一百次载入数据,每次载入1亿个,遍历这一亿个数据,数据落入哪个区间,则那个区间的统计值+1。100次载入完成之后,我们便得到了每个区间的统计值,我们用

来代表数据落入

区间的统计值。那么肯定有

现在我们需要寻找中位数落入哪个区间,100亿个数据的话,中位数应该等于第50亿大和第50亿+1大的数据的平均。所以我们需要知道这两个数,落在哪个区间了。

我们从

开始累加,一直累加到

使得总和大于50亿+1,(等于的情况比较特殊,这里假设不等于。)那么关系到中位数计算的两个数应当落在区间

里。

到这里我们可以得到中位数的区间,我们计算一下上面的过程所需内存情况:载入1亿个数据需要内存32*1亿/8/1024/1024=381.5M,100000个数据组的统计值需要内存8*100000/1024/1024=0.76M 总和小于512,是可行的。

现在我们知道涉及中位数计算的两位数的区间是

,而

里有43000个数据,在

之前的区间中的数据总数为

,下面我们需要找到第50亿个以及第50亿+1这两个数到底是多少。

我们需要再次遍历数据,对落在

区间的数都加以关注,统计

区间内数字

出现的频词

再次分100次载入数据,对落在

区间的数进行关注,为

区间内的每一个整数

都设计一个统计值

区间有43000个数据,所以有43000个统计量。

全部载入完成之后,我们再在

的基础上累加

,如果加上

大于50亿了,那么第50亿大的数据就是

,第50亿+1大的数同理。这样我们就可以计算中位数了。

再次对上面的过程进行内存分析,每次载入1亿个数据需要内存381.5M,43000个统计量需要内存肯定小于上面100000个统计量的情况,所以内存也是足够的。哦还有个

需要内存,但是8位,不值一提。

设计思路以上。

4. 总结数据量过大,分次载入

一共需要两次完全遍历数据。

5. 类似题目

大量数据寻找topK,

解决思路:数据多次载入,进行堆排序,每次载入都获得堆的topK,最后将这些topK再进行排序。

加油,一件事竟然决定去做了,就请做好他。耐住性子,慢慢来。

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页

打赏作者

姜白的树洞

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值