1.i=1; while(i<=n) i=i*2 这个算法的时间复杂度。
解析:先分析i,和循环次数之间的关系 i = 1, 2, 4, 8, 16 ... ,所以假设循环次数是x。,那么i = 2^x ,条件是i <= n
2^x <= n
所以x <= logn
所以x 从1 到logn,一共执行循环体logn次,所以复杂度是logn。
2.求整数n(n≥0)的阶乘的算法如下,其时间复杂度是(A)。
int fact(int n){
if(n≤1) return 1;
return n*fact(n-1);
}
A.O(n) B.O(n²) C.O(nlog²) D.O(log)
解析:本题是求阶乘n!的递归代码,即n×(n-1)×...×1。每次递归调用时fact()的参数减1,递归出口为fact(1),一共执行n次递归调用fact(),故T(n)=O(n)。
3.以下算法的时间复杂度为( D)。
void fun(int n) {
int i=l;
while(i<=n)
i=i*2;
}
A. O(n) B. O(n2) C. O(nlog2n) D. O(log2n)
解析:基本运算是i=i*2,设其执行时间为T(n),则2T(n)<=n,即T(n)<=log2n=O(log2n)。
4.设n是描述问题规模的非负整数,下面程序片段的时间复杂度是(A)。
x=2;
while(x<n/2)
x=2*x;
A. O(log2n) B. O(n) C. O(nlog2n) D. O(n2)
解析:在程序中,执行频率最高的语句为“x=2*x”。设该语句共执行了 t次,则2t+1=n/2,故t=log2(n/2)-1=log2n-2,得 T(n)=O(log2n)。
5.求该方法的时间复杂度
void aFunc(int n) {
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
printf("Hello World\n");
}
}
}
解析:当 i = 0 时,内循环执行 n 次运算,当 i = 1 时,内循环执行 n - 1 次运算……当 i = n - 1 时,内循环执行 1 次运算。 所以,执行次数 T(n) = n + (n - 1) + (n - 2)……+ 1 = n(n + 1) / 2 = n^2 / 2 + n / 2,此时时间复杂度为 O(n^2)。