chapter 9

作者: yangqi916 | 来源:发表于2016-09-22 21:59 被阅读0次

    1. 内容##

    本章讲了一些代码调优的技巧

    1.1 一些调优方法###

    整数取模(取模运算时间大于加减法执行时间),k=k%n 可以替换为 if(k>=n) k=k-n;

    函数、宏、和内联代码

    顺序搜索,采用“哨兵” 让循环体不用 每次都判断边界。从而增加了运行速度

    进行循环展开,替换自增。

    1.2 对于二分的优化###

    对二分进行优化虽然效率提高不少,但也应该看到可读性变得很差,维护起来也比较麻烦。

    2. 习题##

    7.给定一个非常长的字节序列(假设有十亿或万亿),如何高效的统计1的个数?###

    1.算法一:假设x当前为一个奇数,则x=*1(*代表若干个位),则x-1=*0(*部分不变), 相与的结果就是末位的1消失。假设x当前为一个大于0的偶数,则x=*1&0(*代表若干个位,&代表若干个0),则x-1=*0%1(其中%代表若干个1,其数量与上面的&代表的0的数量相等),相与的结果为*0&0,即后面几位全部变成0。 综上,x&(x-1)的结果就是把x的最低位的1变成0.所以下面的函数执行的次数为x中1的个数。

    int OneCount(unsigned int x)
    {
        int count=0;
       for( ; x>0; count++) x &= (x-1);
        return count;
    }
    

    2.算法二: 查表法

    const int idx[256]={0,1,1,……,8}//0~255中含1的个数
    int OneCount(unsigned int x)
    {
      int count=0;
      for(; x>0; x>>=8)
         count+=idx[x&255];
      return count;
    }
    

    8.如何使用哨兵来找出数组中的最大元素?###

    关键是总是设arr[n]为当前找到的最大值,及时去更新arr[n].

    i=0
    while(i < n)
        max=arr[i]
        arr[n]=max //哨兵
        while(arr[i]<max)
            i++
    

    9.y = a(n) * x^n + a(n-1) * x^(n-1) + ... + a1 * x + a0 的计算所需的次数?###

    1.需要2n次

    a[n+1] // contains a[0]...a[n]
    y=a[0]
    xi=1
    i=1
    while( i<=n )
        xi*=x
        y+= a[i]*xi
    

    2.n次---by horner

    a[n+1] // contains a[0]...a[n]
    y=a[n]
    for i in [1,n]
        y=y*x+a[n-i]
    

    相关文章

      网友评论

          本文标题:chapter 9

          本文链接:https://www.haomeiwen.com/subject/lnzzettx.html