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

给定一个最多包含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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值