在一个文件中有 10G 个整数,乱序排列,要求找出中位数(内存限制为2G)

如题 “在一个文件中有 10G 个整数,乱序排列,要求找出中位数(内存限制为 2G)”

  假设整数用32bit来表示。

第一步:要表示10G大小的数字,最少需要一个64位的数据空间。(10G = 5 * 2^31 > 2^32 )

    假如说10G个整数全是1,那么映射后,会全部映射到第一个区间。

    此时,第一个区间的数值应该表示10G,其他的所有区间的数值都为0。要想表示一个数,这个数的大小是10G,只能是64位了。

第二步:分区间

   2G的内存,能够表示多少个64bit,就能分多少个区间。(一个区间 就表示 一个64bit的数据空间)

   区间数位:2G / 64bit = 256M 个区间。

第三步:求区间表示范围

   32bit的整数最大值为2^32-1,所以区间的范围是2^32 / 256M = 16.

   即0 ~ 15 ,16 ~ 31,32 ~ 47,......(总共256M个)

   此时我们有 256M个区间,大小总共为256M * 64bit = 2G内存。

第四步:遍历10G个整数。每读取一个整数就将此整数对应的区间+1。

第五步:找出中位数所在的区间

   统计每个区间中整数的值。然后从第一个区间的整数值开始累加。当累加到5G时,停止。此时的区间便包含中位数。记下此区间所表示的范围,设为[a,a+15].并且记下此区间之前所有区间的累加和,设为m。释放掉除包含中位数区间的其他所有区间的内存。

第六步:再次遍历10G个整数,统计出现在区间[a,a+15]中每个值的计数,有16个数值,按照a到a+15排序。设为n0,n1,n2,...n15

第七步:当m+n0+n1+...+nx首次大于5G时,此时的 a+x 就是所求的中位数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值