【算法导论】提供了3种方法来计算算法时间复杂度。
1、主方法(【算法导论】 P94)
2、数学归纳法(mathematical induction,【算法导论】 P83)
如果不满足主方法(The master throrem)的形式结构,可以用归纳法进行证明。
3、递归树方法(【算法导论】 P88)
递归树方法基本满足主方法(The master throrem)的结构形式,只是更形象化的理解。
4、例子
1)【算法导论】P59
递归结构:T(n)=2T(n/2)+n
f(n)=n,满足主方法(The master throrem)的第二种情形,所以T(n)=n*lgn
2)【算法导论】P59
递归结构:T(n)=2T(n/2)+n*lgn
f(n)=n*lgn不是多项式意义上的大于n,所以不满足主方法(The master throrem)的第三种情形。
根据【算法导论】P106 课后题4.6-2的证明题:
算法复杂度为:n*(lgn)^2
3)【算法导论】 P87 课后题4.3-1
递归结构:T(n)=T(n-1)+n,假设复杂度为O(n^2)
则数学归纳法证明:T(n)≤c*(n-1)^2
=c*n^2 +(1-2*c)n+c
= O(n^2)
*******************************************************************************************************************
练习题
- 以下算法的时间复杂度为(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)
- 设n是描述问题规模的非负整数,下面程序片段的时间复杂度是(A)
x=2;
while(x<n/2)
x=2*x;
A. O(log2n) B. O(n) C. O(nlog2n) D. O(n2)