40亿个整数,求上中位数

来源:互联网 发布:nes30 pro软件 编辑:程序博客网 时间:2024/06/05 16:30

40亿个大整数,组成大文件。

想找到其中,上中位数。


内存,10MB,怎么办?

内存,20K,怎么办?

内存,有限的几个字符,怎么办?

条件:按行读文件,这个动作假设不占用内存。


40亿个整数,每个4字节,160亿字节,大约16G。

第一、不要从个数下手,要从范围下手。

如果是无符号整数:0至42亿,则表示1个整数的词频,是不会溢出的。


10MB: 

4字节一个数,则最多250万,250万是可以在内存总统计的。

即10MB空间支持250万精细范围,0至42亿上有1680个250万范围。

统计:0-250万;250万-500万;......各个区间内有多少个数

我们要求第20亿个数,则可以在大小为1680的数组中,去做加法,确定第20亿个数的范围,之后精细地去求那个范围中的准确值。


20K:

2万能表示的范围时5000的范围0~4999

42亿/5000,范围爆炸了;

所以,反过来,把42亿划分成5000个范围,如果能表示下,则范围是5000,照上例即可。如果还是装不下,二级分化,再划分每个范围再划分更小的5000个子范围。


如果只有有限个字符:

比如2个字符:

0~42亿上二分,然后一个变量记录它的二分的划分值是什么,另一个变量记录0~当前划分值的区间内有多少个数,最多32次,就可以求出来。




阅读全文
0 0
原创粉丝点击