《编程珠玑》第二章2.1 二分查找不存在的数

来源:互联网 发布:广西都市频道网络电视 编辑:程序博客网 时间:2024/05/16 10:23
《编程珠玑》第二章2.1的三个问题中,有个问题是这样的:
         给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数(在文件中至少缺失一个这样的数——为什么?)。
1、如果有足够的内存,如何处理?
2、如果内存不足,仅可以用几个外部的临时文件来进行处理,如何处理?


解:设x是不存的数。

可以从最低位开始进行探测,根据0或者1进行分组,分成两组之后,比较哪组的数目较少,比如位上是0的较少的话,那么x的第一位就是0.

,如果两组数量相当,那么对应的位数是0还是1都无所谓,你随便取值,可以暂且取成0。

这样依次类推到最高位,就可以得到一个 x的值,这个x就是我们要求的值。  

比如:对3位的整数进行查找为例。
   有如下8个3位的整数:0、1、2、3、4、4、6、7, 我们此时故意去掉7,

  以二进制表示是:

x :1   1   1       

 0   0   0

0   0   1
0   1   0

0   1   1
1   0   0 
1   0   1
1   1   0
  可以看出来 最后一列也就是最低位上 有4个0,3个1,此时x的最低位取 1

此时序列里还剩下

001

011

101

  第二位上有2个0,1个1,则x第二位取1,

之后序列里只剩下

011

  第三位上1个0,0个1,x第三位取1,     得到x = 111(二进制) 得到 x=7。


这次我们再去掉一个2,这样的话一共少了2个数 2跟7

以二进制表示是:

x :   ?   ?  ?       

        0   0   0

        0   0   1

       0   1   1
       1   0   0 
       1   0   1
       1   1   0

此时最低位 0跟1的数目一样,我们暂时取0的那边,之后剩下的序列为:

000

100

110

此时第二位上的0比1多,我们取1,序列还剩下

110

第三位上有个1米有0,则此时取第三位为0
 则 x= (010)(二进制)   即x=2,

此时回过头去,再把最后一位设置为1的话,球出来的是x=7.


OK了,我的思路就是这样的,只是把书上的概念实例化了一下!!! 若有43亿个数的话,求重复的数,取位数上出现较多的就可以了。