【发布时间】:2012-04-14 09:30:00
【问题描述】:
我正在阅读有关在Programming Pearls 中从一系列 40 亿个 32 位整数中查找缺失数字的问题,但无法完全找到解决方案。
给定一个最多包含 40 亿个 32 位的顺序文件 随机顺序的整数,找到一个不在文件中的 32 位整数。
约束:几百字节的主存,但充分利用 磁盘上的外部暂存文件
所描述的解决方案是一个过程,我们使用高位分隔范围中的数字(即,在第一遍中,我们将具有前导 0 位的数字写入一个文件,将具有前导 1 位的那些写入另一个文件。我们继续使用第二位等)并使用作为新搜索范围的一半作为新的搜索范围,其中包含少于该范围中数字的一半。
我在SO 中搜索并找到了一个类似的帖子,它并没有完全回答我的问题,即确切 数字是如何找到的(我不明白二进制搜索是如何适合单独的范围)。
@Damien_The_Unbeliever 的答案似乎最相关,但从我的角度来看,我认为按照这个过程我们最终会得到 2 个文件:一个范围内有 2 个数字的文件和一个有 1 个数字的文件。
通过将一个文件中的(一个)数字与其他文件中最大的数字相减,我们可以得到一个缺失的数字(不需要位掩码,我不太确定我们是否真的可以应用位掩码,因为范围在任何时候都是未知的)。
我错了吗?有人可以帮助解决这个问题吗?
【问题讨论】:
-
@MitchWheat:我已经链接到那个帖子,它没有回答我的问题。那个帖子是关于理解分离范围的过程。我的问题是如何找到实际数字。这个问题是除了我已经提到的
Damien_The_Unbeliever的提示之外,从未在该帖子中提及或回答 -
您不需要任何外部存储。不用按位 k 分隔数字,只需分别计数即可。
-
@n.m. : 我不太清楚你的意思。你能详细说明一下吗?
-
@Li-aung Yip:请忽略我的评论,这种方法效率不高。
标签: java algorithm search binary-search