读书人

在一个资料中有10G个整数乱序排列

发布时间: 2012-09-10 11:02:32 作者: rapoo

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

解法:首先假设是32位无符号整数。
1.?读一遍10G个整数,把整数映射到256M个区段中,用一个64位无符号整数给每个相应区段记数。
说明:整数范围是0?-?2^32?-?1,一共有4G种取值,映射到256M个区段,则每个区段有16(4G/256M?=?16)种值,每16个值算一段,?0~15是第1段,16~31是第2段,……2^32-16?~2^32-1是第256M段。一个64位无符号整数最大值是0~8G-1,这里先不考虑溢出的情况。总共占用内存256M×8B=2GB。

2.?从前到后对每一段的计数累加,当累加的和超过5G时停止,找出这个区段(即累加停止时达到的区段,也是中位数所在的区段)的数值范围,设为[a,a+15],同时记录累加到前一个区段的总数,设为m。然后,释放除这个区段占用的内存。

3.?再读一遍10G个整数,把在[a,a+15]内的每个值计数,即有16个计数。

4.?对新的计数依次累加,每次的和设为n,当m+n的值超过5G时停止,此时的这个计数所对应的数就是中位数。

读书人网 >编程

热点推荐