编程珠玑 第四章 读书笔记

本文探讨了算法优化技巧,包括如何实现二分查找的正确边界控制,避免常见误区,并给出了高效的递归算法实现,对比了不同算法的执行效率。
习题:
2:我写的做不到log(n),而是n2;(9.3章节有log(n))
int erfeng(string &s, int l, int r, char n)
{
    intmid;
   while(l<=r)
    {
       mid =((l+r)>>1);
       if(s[mid]==n)
       {
          int i;
          for(i=mid;i>=0; i--)
          {
            if(s[i]!=n)
            {break;}
          }
         if(i==0&&s[i]==n)
          returni;
          else returni+1;
       }
       if(s[mid]>n)
       {
         r=mid-1;//控制-1!!!!
       }
       else
       {
         l=mid+1;//控制+1!!!!
       }
    }
    return-1;
}//复杂度为O(log(n))
第六题:
这个过程一定会终止的,为什么呢?
如题意,我们每次都至少会倒出一颗豆子,要么倒出两颗白豆子或是0颗白豆子;
所以在咖啡罐子里的白豆子的奇偶性是不会变化的;
所以如果,白豆子初始的时候是奇数的话,那么最后一定会留意个白豆子下来;
第七题:
二分,然后又带点模糊搜索,话说我写的不太好效率不是很满意;
int erfeng(string &s, int l, int r, char n)
{
    while(l<r)
    {
       if(n==s[l])
       {printf("在线段%d上\n", l+1); return 0;}
       if(n==s[r])
      {printf("在线段%d上\n", r+1); return 0;}
       if(s[(l+r)/2]==n)
       {
         printf("在线段%d上\n", (l+r)/2+1);
          return0;
       }
       if(s[(l+r)/2]>n)
       {
         if(s[(l+r)/2-1]<n)
          {
            printf("在线段%d与线段%d之间\n",(l+r)/2, (l+r)/2+1);
             return0;
          }
         r=(l+r)/2-1;//控制-1!!!!
       }
       else if(s[(l+r)/2]<n)
       {
         if(s[(l+r)/2+1]>n)
          {
            printf("在线段%d与线段%d之间\n",(l+r)/2+1, (l+r)/2+2);
             return0;
          }
         l=(l+r)/2+1;//控制+1!!!!9
       }
    }
   printf("找不到\n");
    return0;
}
第九题:
其实书本上有个地方挺误导人的;
p42,quare(exp(x, n/2));
这个伪代码很容易让人误会啊,让人以为翻译过来是:
exp(x, n/2)*exp(x, n/2);
其实应该这样的:exp(x*x, n/2);
完整代码如下:这样就很容易看明白了;
long function1(int x, int n)
{
    if (0 ==n)
    {
       return1;
    }
    if(n%2==0)
    {
       //returnfunction1(x, n/2)*function1(x, n/2);
       returnfunction1(x*x, n/2);
    }
    else returnx*function1(x, n-1);
}
这个算法的复杂度是O(logn)效率非常的好;
999999 999999999
  -912380481
Time1:0
  -912380481
Time2:3.66e+06

12345 12345556
  1419728353
Time1:0
  1419728353
Time2:40000

Time1是采用书本的方法的时间,
TIme2是采用最普通的遍历地方法的时间;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值