混乱计算字节和兆字节之间的大小

时间:2018-03-08 19:41:15

标签: sorting byte megabyte

这是一个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的幂才能达到这个尺寸?

3 个答案:

答案 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”,这可能是准确的,具体取决于粗略的含义。