珍珠编程问题,第2版:
鉴于包含4,300,000,000个32位整数的顺序文件,如何找到至少出现两次的整数?
书中提供的解决方案:
二进制搜索通过递归搜索包含一半以上整数的子区间来查找至少出现两次的元素。我的原始解决方案并不能保证每次迭代中整数的数量减半,因此 log 2 n 次通过的最坏情况运行时间与 n成正比·log n 。 Jim Saxe通过观察搜索可以避免携带太多重复项来将其减少到线性时间。
当他的搜索知道了 复制必须在当前范围内 m 整数,只存储 m + 1 目前工作录像带上的整数;
如果磁带上有更多的整数,他的程序会丢弃它们。虽然他的方法经常忽略输入变量,但它的策略足够保守,以确保它至少找到一个副本。
以上是本书的内容。我不明白引用的句子。它究竟如何实施?我的意思是,他怎么知道“副本必须在 m 整数的当前范围内”?
感谢您的帮助!
答案 0 :(得分:3)
2 ^ 32 = 4,294,967,296。你有一个包含4,300,000,000个整数的文件,保证重复。
找到中心数字,它应该是2 ^ 31 = 2147483648.如果它更少,重复项很可能在下半部分。如果没有,则在上半部分发生重复。
再次找到中央号码,它应该是2 ^ 30 = 1073741824 ......
重复,直到找到副本。
答案 1 :(得分:1)
我认为它指的是鸽子原则,即如果一组中最小和最大元素之间的差异小于该组的基数,则必须有重复。
您可以在构建子集时检查此项,并在确定该子集中必须存在重复项后立即停止构建子集。
答案 2 :(得分:0)
哇。我觉得这本书可能有点老了。这是一个基本的二进制搜索问题。
我认为这本书有点尴尬。也许试试维基百科