这是一个solved problem,我们必须从输入数据中找到一个缺失的整数,该整数是一个包含40亿个未排序无符号整数的文件形式。问题是只能使用10 MB的内存。
作者给出了我们做2次通过的解决方案。在第一遍中,我们创建了一些大小的“块”数组。例如。块0代表0 to 999
,1代表1000 to 1999
,依此类推。因此,我们知道每个块中有多少值应该。
现在我们扫描文件并计算每个块中实际存在的值数 - 这将导致我们缺少整数。
我理解这种方法。但是,要计算适当的块大小,请从以下开始:
第一遍中的数组可以容纳10 MB或大约2 ^ 23字节的内存。
10
MB如何与2^23
相同?我无法理解2^23
号码来自何处。
所以2^24
是16MBytes,所以他可能正在使用最近值为10 MB或更小的2^23
。如果是这样的话,为什么他不能使用整个10 MB?即为什么他必须使用2的幂才能达到这个尺寸?
答案 0 :(得分:1)
未说明,但我假设问题是从一个文件中找到一个缺少的整数,其中包含一组2 ^ 32(4294967296)唯一的32位无符号整数,值为0到4294967295.该文件占用17179869184字节空间。
使用2 ^ 23 = 8388608的存储空间允许2 ^ 21 = 2097152 32位无符号整数计数保存在存储器中。每组代表(2 ^ 32)/(2 ^ 21)= 2 ^ 11 = 2048个值。因此count [0]用于值0到2047,count [1]用于值2048到4095,...,count [2097151]用于值4294965248到4294967295.循环内部的主线将是count [value>> 21] + = 1.所有计数都是2048,除了对应于缺失整数的计数,其计数为2047.第二遍只需读取适当范围内的2047值找到缺失的整数。
另一种方法是使用4194304 16位计数,每组表示1024个值(最大计数值为1024),但时间上没有显着差异。
假设10MB = 10 * 2 ^ 20 = 10485760,则可以使用10 * 2 ^ 18 = 2621440 32位计数,每个计数范围为1639个值(较小组的最后计数),这是尴尬。如果使用16位计数,那么3278值的范围也很难。
答案 1 :(得分:0)
我相信它应该是10 * 2 ^ 23或5 * 2 ^ 24位。 尝试查看它是否在字节或位
10 MB = 2*5*2^20*2^3
M=2^20
B=2^3b
10=2*5
答案 2 :(得分:0)
不是。
1 MB是2 ^ 20字节(1024 X 1024)= 1048576 10 MB则为10485760。
2 ^ 23 = 8388608
当然,该网站称10 MB是“大约2 ^ 23”,这可能是准确的,具体取决于粗略的含义。