海量数据找中位数

法一

原博客链接

思路如下:

从10亿个数据(int型占据4B)中找中位数,内存限制为1GB。

不可能一次性把数据全部加载到内存中,再使用快速排序算法,因为10亿*4B大约为4GB,内存不够。

可以一次性读入1GB的数据(分10次读取),然后对读入的1GB数据按照最高位即第32位的值进行分类并写入文件,如果最高位是1,写入file1,否则写入file2。那么file1全是负数,file2全是正数,如果file1中有4亿个数字,file2中有6亿个数字,那么中位数就是file2中排序之后从小到大的第1亿个数。

然后再把file2中的数据每次读入1GB进入内存,然后对读入的数据按照次高位即第31位的值进行分类写入文件,如果最高位是1,写入file3,否则写入file4,那么file3中的数据都比file4中的数据大,如果file3中有3亿个数字,file4中也有3亿个数字,那么中位数就是file4中从小到大排序后的第1亿个数字。

然后再把file4中的数据每次都读入1GB进入内存,然后对读入的数据按照次次高位即第30位的值进行分类写入文件。。。

如此下去,直至判断中位数为某一个文件中,且该文件中数据个数在2.5亿个(或者更少)时即可用快速排序找出它。

 

法二

原博客链接

<
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值