DianNier  

一、循环嵌套型
1.下列算法中m++语句的执行次数为【外层循环是n次,内层次数与外层变量有关】

点击查看代码
int m=0,i,j;
for(i=1;i<=n;i++)
	for(j=1;j<=2*i;j++)
		m++;
答案:n(n+1) 解题思路:外层循环是执行n次,当不知道的时候就用列举法:当i=1,j执行2*1次;当i=2,j执行2*2;当i=n,j执行2*n次。则当i执行n次从1~n时,j执行2(1+2+...+n)=n(n+1)

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.对于循环嵌套型,就去求最深层次的语句的执行次数。

posted on 2025-03-18 08:57  芭娜娜banana  阅读(61)  评论(0)    收藏  举报