如果有如下递归推倒式
n>0 n > 0 , 根据 a a , , f(n) f ( n ) 分析算法复杂度
首先我们可以理解一下 a a , , n n , 的含义
- n n : 问题规模
- : 子问题规模
- a a : 子问题数量
- : 递推以外额外的工作量
我们先看一个简单的例子,
T(n)=∑i=1ni
T
(
n
)
=
∑
i
=
1
n
i
, 如果把它写成上面的递归推导式, 满足
T(n)=aT(na)
T
(
n
)
=
a
T
(
n
a
)
更详细地表示:
每个子问题规模是原问题的 110 1 10 , 但是子问题数量也变成了10倍
如果不考虑 f(n) f ( n ) , T(n)=aT(nb) T ( n ) = a T ( n b ) , 我们考虑下a和b之间的大小,
- 如果 a=b a = b , 采用递归后总问题规模不变
- 如果 a<b a < b , 采用递归后总问题规模变小
- 如果 a>b a > b , 采用递归后总问题规模变大
这个指标可以用 logab log b a 来衡量
设
k=lognb
k
=
log
b
n
展开递推式:
只考虑 f(n) f ( n ) 为多项式的情况,设 f(n)=cnd f ( n ) = c n d
在
f(n)=cnd
f
(
n
)
=
c
n
d
设定的基础上, 考虑一种特殊情况,
logab=d
l
o
g
b
a
=
d
, 即
a=bd
a
=
b
d
所以 T(n)=Θ(ndlgn) T ( n ) = Θ ( n d lg n )
在
f(n)=cnd
f
(
n
)
=
c
n
d
设定的基础上, 对一般情况, 展开表达式:
利用等比数列求和公式可以得到
可以看到 T(n)=max(O(nd),O(nlogab)) T ( n ) = m a x ( O ( n d ) , O ( n l o g b a ) )
- 当 logab<d log b a < d : T(n)=O(nd) T ( n ) = O ( n d )
- 当 logab=d log b a = d : T(n)=O(ndlgn) T ( n ) = O ( n d lg n )
- 当 logab>d log b a > d : T(n)=O(nlogab) T ( n ) = O ( n l o g b a )
更一般的情况请看维基百科页面 Master theorem
回到例子
T(n)=∑i=1ni
T
(
n
)
=
∑
i
=
1
n
i
,它可以表示为
T(n)=aT(na)
T
(
n
)
=
a
T
(
n
a
)
,所以它的复杂度为
O(nlogaa)=O(n)
O
(
n
log
a
a
)
=
O
(
n
)
再如快速排序,它可以表示为
T(n)=2T(n2)+O(n)
T
(
n
)
=
2
T
(
n
2
)
+
O
(
n
)
所以它的复杂度为
nlgn
n
lg
n