您的位置:首页 > 编程语言

关于编程珠玑第2章的整理

2015-08-30 22:59 274 查看
给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中一32位整数。

    1、在文件中至少存在这样一个数?

    2、如果有足够的内存,如何处理?

    3、如果内存不足,仅可以用文件来进行处理,如何处理?

    答案:

    1、如果采用位图思想来存放,则32位整数最多需要占用43亿个位。约512MB的内存空间。

       如果某位上为1则存在这个数,为0则不存在这个数

       int a[1+n/32];

       void set(int i) {a[i>>32] |= (1<<(i&MASK));}

       void clr(int i) {a[i>>32] &= ~(1<<(i&MASK));}

    2.如果用二分搜索来解决此问题,算法如下

      算法认为如果32位整数都存在的话则每个bit位上的0,1数量是相当的。

      int split(int* a, int* b, int*c, int alen, int bit)

     {

          int biter, citer, i;//biter、citer分别是b和c的索引计数器

          int v=0, re = 0, *t;

          while(bit--){

              v = (1 << bit); //v从最高位开始依次向后

              for(i=biter=citer=0; i < alen; i++) { //遍历数组a

                  if(a[i] & (1<<bit)) {

                     b[biter++] = a[i];//若a[i]的第bit位为1,就把它存入b中

                  } else {

                     c[citer++] = a[i];//若a[i]的第bit位为0,则存入c中

                  }

              }

              if(biter <= citer) {//在遍历第bit位中,bit位为1的数比bit位为0的数少,那么缺失值肯定

                       //在bit位为1的中(在b中)

                 re += v;        //所以将待求值第bit位置1

                 t = a;

                 a = b;

                 b = t;        //我觉得这里将b给a就行了,没必要交换

                 alen = biter;    

             } else {

                 t = c;        //若c数量少,则缺失值第bit为0,不用处理

                 c = a;

                 a = t;        //将c赋给a,进行下一次迭代

                 alen = citer;

            }

         }

         return re;

     }

    
2.字符串循环移位比如abcdef 左移三位,则变成defabc

求逆

   比如 abcdefgh

   reverse(a,0,i-1); cba defgh

   reverse(a,i, n-1); cba hgfed

   reverse(a, 0, n-1); defgh abc
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: