时间复杂度标记与分析(算法分析与设计)

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 )

时间复杂度标记与分析(算法分析与设计)_第1张图片

例子: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/232 + 2((n/242 +…+2((n/2i2 + 2T(n/2i + 1)))…))))  ……(1)

而当n/2i+1 == 1时,迭代结束。

将(1)式小括号展开,可得:

T(n) = n2 + 2(n/2)2 + 22(n/222 + … + 2i(n/2i)2 + 2i+1T(n/2i+1)

这恰好是一个树形结构,由此可引出递归树法。

时间复杂度标记与分析(算法分析与设计)_第2张图片

图中所有节点之和为:[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描述

时间复杂度标记与分析(算法分析与设计)_第3张图片

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)。

你可能感兴趣的:(数据结构与基础算法)