题型一
1.设n是描述问题规模的正整数,则下列程序片段的时间复杂度是()
i=n*n;
while(i!=1)
i=i/2;
A. O( l o g 2 n log_2n log2n)
B. O(n)
C. O( n \sqrt{n} n )
D. O( n 2 n^2 n2)
【解析】
答案:A
2. 下面算法的时间复杂度是()
void fun(int n)
{
int i=0,s=0;
while(s<n)
{
++i;
s=s+i;
}
}
A. O(n)
B. O( n 2 n^2 n2)
C. O( n \sqrt{n} n )
D. O( n l o g 2 n nlog_2n nlog2n)
【解析】
答案:C
设循环执行 k 后 s == n,相当于 s = 1+2+3+…+k = n, (k*(k+1))/2 = n, 忽略系数和低次项,所以 k = n^(1/2)
题型二 阶乘
求整数n(n>=0)阶乘的算法如下,其时间复杂度是()
int fact(int n)
{
if(n<=1) return 1;
return n*fact(n-1);
}
A. O( l o g 2 n log_2n log2n)
B. O(n)
C. O( n l o g 2 n nlog_2n nlog2n)
D. O( n 2 n^2 n2)
【解析】
答案:B
记住阶乘的复杂度都是O(n),即可。
n!=n*(n-1)*(n-2) … … *1,在每一轮我们都只执行了一次递归调用,不要误以为是每一轮的 n 相乘。