【发布时间】:2016-01-08 02:20:48
【问题描述】:
问题是,给定一个包含 40 亿个整数的输入文件,提供一个算法来生成一个不包含在文件中的整数,假设只有 10 MB 内存。
搜索了一些解决方案,其中一个是将整数存储到位向量块中(每个块代表40亿范围中的特定整数范围,块中的每个位代表一个整数),并使用另一个计数器每个块,计算每个块中的整数个数。因此,如果整数的数量小于整数的块容量,则扫描块的位向量以查找丢失的整数。
我对这个解决方案的困惑是,当块计数器数组占用与位向量相同的内存时,提到了最佳的最小占用空间。我很困惑为什么在这种情况下它是最佳的最小足迹?
这里是我提到的计算细节,
Let N = 2^32.
counters (bytes): blocks * 4
bit vector (bytes): (N / blocks) / 8
blocks * 4 = (N / blocks) / 8
blocks^2 = N / 32
blocks = sqrt(N/2)/4
提前致谢, 林
【问题讨论】:
-
当然,因为有足够的硬盘空间,你复制原始文件,用一堆 fread/fseek/fwrite (O(n log n)) 对磁盘上的文件进行排序,然后瞧.. . 没有占用太多内存 (RAM)...
-
@LưuVĩnhPhúc,阅读帖子,但没有提及如何找到优化的块大小。如果你有任何想法,感谢分享。 :)
-
@LinMa 您的块计数解决方案与“文件排序”有什么关系?
标签: algorithm bit-manipulation bit