“编程珍珠”二进制搜索帮助

时间:2011-02-16 01:28:26

标签: algorithm programming-pearls

我似乎无法理解这是如何运作的。

问题:
给定一个顺序文件,其中包含最多40个随机顺序的32位整数,找到一个不在文件中的32位整数(并且必须至少有一个缺失)

答案:
根据表示每个整数的32位来查看这个二进制搜索是有帮助的。在算法的第一遍中,我们读取(最多)40亿个输入整数,并将那些前导零位写入一个顺序文件,将那些前导一位写入另一个文件。

其中一个文件最多包含20亿个整数,因此我们接下来将该文件用作当前输入并重复探测过程,但这次是在第二位。

所以通过一遍又一遍地拆分文件(二进制搜索),这实际上会如何导致我丢失32位整数?

2 个答案:

答案 0 :(得分:12)

每次传球后,你的下一次传球将在你编辑的两个名单中较小的一个。

在某些时候,你必须遇到一个空列表,这将决定你的号码。例如,我们只使用3位数字。

000
001
110
100
111

在第一次通过后我们

000
001

110
100
111

然后我们查看第一个列表中的第2位,因为它小于(或等于)第二个位。 我们将它们分成

000
001

empty list

请注意以01开头的文件是如何为空,这意味着没有以01开头的数字,因此010011缺失。< / p>

我们最终必须有一个缺失列表的原因是因为我们每次都为下一次传递选择较小的列表。

答案 1 :(得分:0)

最后,如果你继续拆分,你将拥有(最多)40亿个文件,每个文件中都有一个整数。从理论上讲,您将“知道”哪一个丢失,因为没有文件。

您最终可能会遇到奇数个整数的情况。在这种情况下,较小的一半将缺少一个数字。这样可以更容易地找到丢失的号码。

如果你有一个偶数,你知道有两个丢失了。在这种情况下,您必须找到小于它们各自的一半的部件,然后继续上面的解决方案。