2g内存,磁盘上有100亿零1个32bit 的uint,找中位数,要求读磁盘次数最少
很容易想到桶排序,问题是桶的宽度。
由于统计个数,某个桶内可能超过100亿,所以int不行,必须long long
2g内存能放多少long long呢?
2g内存 =
2
∗
2
10
M
2*2^{10}M
2∗210M=
2
∗
2
20
K
2*2^{20}K
2∗220K=
2
∗
2
30
b
y
t
e
s
2*2^{30} bytes
2∗230bytes(刚开始脑子秀逗,认为2g内存 =
2
∗
2
3
M
2*2^{3}M
2∗23M=
2
∗
2
6
K
2*2^{6}K
2∗26K=
2
∗
2
9
b
y
t
e
s
2*2^{9} bytes
2∗29bytes,注意这里底数是2啊,不是10。。。),而long long占
2
3
b
y
t
e
s
2^3 bytes
23bytes,所以可以申请
2
31
2
3
=
2
28
\frac{2^{31}}{2^{3}}=2^{28}
23231=228个桶。uint32是
2
32
2^{32}
232
,所以桶的宽度是16。
所以,两次读磁盘就够了。。。