chapter 9

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]

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)