一、循环嵌套型
1.下列算法中m++语句的执行次数为【外层循环是n次,内层次数与外层变量有关】
点击查看代码
int m=0,i,j;
for(i=1;i<=n;i++)
for(j=1;j<=2*i;j++)
m++;
2.【2014年统考真题】(外层为指数次增长,内层为n次)
点击查看代码
count=0;
for(k=1;k<=n;k*=2)
for(j=1;j<=n;j++)
count++;
答案:O(nlog₂n)
解题思路:内层循环每次都是n次,主要看外层循环执行多少次;外层变量每次为2的指数,外层为log₂n。则每次为nlog₂n。
3.【2022统考真题】(外层是指数次增长,内层与外层变量有关)
点击查看代码
int sum=0;
for(int i=1;i<n;i*=2)
for(int j=0;j<i;j++)
sum++;
答案:O(n)
解题思路:对于外层循环i是熟悉的指数型增长,设外层循环k次,则2k>=n,则k=log₂n;对于内层循环的执行次数与外层循环的变量i有关,每次它都执行i次,即内层循环每次分别执行1、2、4、8....2k次,等比数列求和Sn=a₁(1-qn)/(1-q)。则Sn=2k-1,即n-1.
二、递归调用
1.
点击查看代码
int Func(int n){
if(n==1) return 1;
else return 2*Func(n/2)+n;
}
答案:O(log₂n)
解题思路:主要看他循环调用Func函数多少次。其实调用多少次取决于n能够除多少次2。设能调用k次,即n/2^k=1,则k=log₂n。
三、单层循环但有特殊循环条件
1.【2011统考真题】
点击查看代码
x=2;
while(x<n/2)
x=2*x;
答案:O(log₂n)
解题思路:像这种问题就设能够执行k次,把x换成k的函数使之<n/2。由代码可知,每循环一次,x都乘以2,即x是以指数形式增长的,则2^(k+1)>=n/2时,结束循环,则求解出k。
2.【2017统考真题】
点击查看代码
int func(int n){
int i=0,sum=0;
while(sum<n) sum+=++i;
return i;
}
答案:O(n^(1/2))
解题思路:设执行k次,把x换成k的表达式,由代码列举可得,sum=0+1,0+1+2,0+1+2+3,...,0+1+2+..+k,则根据等差数列求和公式得k²/2>=n.
四、总结
1.对于循环嵌套型,就去求最深层次的语句的执行次数。

浙公网安备 33010602011771号