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]
网友评论