A.渐进分析记号
O:渐进上界记号,算法A时间复杂度最大不会超过O(f(n))
Ω:渐进下界记号,算法A时间复杂度最小不低于Ω(f(n))
Θ:渐进确界记号,算法A时间复杂度在Θ(f(n))这个级数
B.算法分析基本法则
a.递归算法复杂度分析
1.主方法(适用于T(n)=aT(n/b)+f(n)型)
递归式子:T(n)=aT(n/b)+f(n)(其中f(n)含logn的情形不符合主定理的适用范围)
第1)条:n^[logb(a)-c] 等于 [n^logb(a)]/[n^c]。 因为 n>1,所以[n^c]大于1,所以第一条翻译成人话,就是当f(n)< n^logb(a)时,时间复杂度T(n)=Θ( n^logb(a) )
第2)条:当f(n)= n^logb(a)时,时间复杂度T(n)=Θ(【n^logb(a)】*【logn】)
第3)条:当f(n) > n^logb(a)时,时间复杂度T(n)=Θ( f(n) )
记忆:哪个大,时间复杂度就是哪个!若相等,就乘个logn
(为什么乘log n : 可能是源于递归树法?树高为H的完全二叉树,其树高为logn )
例子:T(n)=9T(n/3)+n
f(n)=n,n^logb(a)=n^2,f(n)
Θ ( n^logb(a) ),T(n)=Θ( n^2 )
2.递归树(<或直接代入迭代求>一般主方法不适用的递归)
由例子1:T(n)=2T(n/2)+n^2描述
迭代2次可以得:
T(n) = n2 + 2(2T(n/4) + (n/2) 2)
还可以继续迭代,将其完全展开可得:
T(n) = n2 + 2((n/2) 2 + 2((n/22)2 + 2((n/23) 2 + 2((n/24) 2 +…+2((n/2i) 2 + 2T(n/2i + 1)))…)))) ……(1)
而当n/2i+1 == 1时,迭代结束。
将(1)式小括号展开,可得:
T(n) = n2 + 2(n/2)2 + 22(n/22) 2 + … + 2i(n/2i)2 + 2i+1T(n/2i+1)
这恰好是一个树形结构,由此可引出递归树法。
图中所有节点之和为:[1 + 1/2 + (1/2)2 + (1/2)3 + … + (1/2)i] n2 = 2n2
故上述的时间复杂度为:Θ(n^2),该式子由主方法来计算时间复杂度,也是Θ(n^2)
由例子2:T(n)=T(n/3)+T(2n/3)+n描述
当n/(3/2)i+1为1时,树高最大,次数i为log3/2(n),树高也是log3/2(n),时间复杂度为n*log3/2(n),即Θ(nlogn)
b.非递归算法
求和法(循环)
for(i=0;i
,一层的循环就是一层的∑。算法复杂度为n^2(cost)。