《Programming Pearls》二分查找帮助

Posted

技术标签:

【中文标题】《Programming Pearls》二分查找帮助【英文标题】:"Programming Pearls" binary search help 【发布时间】:2011-06-28 01:11:52 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

每次通过后,您的下一次通过将在您编译的两个列表中较小的一个。

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

000
001
110
100
111

在我们第一次通过之后

000
001

110
100
111

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

000
001

empty list

注意以01 开头的文件是空的,这意味着没有以01 开头的数字,因此缺少010011

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

【讨论】:

101呢?它不应该也丢失了吗 您的问题说要找到A 号码,而不是说要找到ALL 号码。这就是这种方法有效的原因。 哦,我明白了,我以为它会吐出所有数字,谢谢! @WuHoUnited “然后我们查看第一个列表中的第二个位,因为它小于(或等于)第二个”......小于或等于第二个?还有什么是大 O 复杂性? O(lg n) ? @Geek 在这句话中,第一个列表指的是 000、001。(第二个列表是 110、100、111)。更小是指其中的元素更少。大的 O(n) 复杂度取决于您想要成为“n”(在这种情况下是 32 位的 n 还是 2^32 个可能的数字,或者是 40 亿个选定的数字)【参考方案2】:

最终,如果你继续拆分,你将(最多)有 40 亿个文件,每个文件都有一个整数。理论上,您将“知道”缺少哪个文件,因为没有文件。

您也可能会遇到奇数个整数的情况。在这种情况下,较小的一半将丢失一个数字。这样可以更轻松地找到丢失的号码。

如果你有一个偶数,你就知道少了两个。在这种情况下,您必须找到小于其各自一半的部分,然后继续上述解决方案。

【讨论】:

以上是关于《Programming Pearls》二分查找帮助的主要内容,如果未能解决你的问题,请参考以下文章

Programming Pearls 中的 qsort 函数出错?

以下程序中的位掩码用法来自 Programming Pearls

用 1 MB 空间对 1000 万个整数进行排序解决方案解释 - Programming Pearls

HDU 5090 Game with Pearls

二分查找算法

10-二分查找算法