公式法
形如: f ( n ) = a f ( n / b ) + d ( n ) f(n)=af(n/b)+d(n) f(n)=af(n/b)+d(n)
①若d(n)为常数,则
f
(
n
)
=
{
O
(
l
o
g
n
)
,
a
=
1
O
(
n
l
o
g
b
a
)
,
a
≠
1
f(n)=\begin{cases} O(logn),&a=1 \\O(n^{log_ba}),&a≠1 \end{cases}
f(n)={O(logn),O(nlogba),a=1a=1
②d(n)不为常数,则
f
(
n
)
=
{
O
(
n
)
,
a
<
b
O
(
n
l
o
g
n
)
,
a
=
b
O
(
n
l
o
g
b
a
)
,
a
>
b
f(n)=\begin{cases} O(n) ,&a<b \\O(nlogn),&a=b \\O(n^{log_ba}),&a>b \end{cases}
f(n)=⎩⎪⎨⎪⎧O(n),O(nlogn),O(nlogba),a<ba=ba>b
Notes:
1.公式中log的
l
o
g
n
logn
logn的底数是省略的,因为n->∞,底数无论是何值都不影响最终的结果。
2.不满足公式法的递归方程则应采用递归树求时间复杂度,以上公式也均可以由递归树推导。
递归树法
下面用以一个例子来介绍递归树法。
T(n) = T(n/3) + T(2n/3) + n
*式子中,n是问题的规模
首先,通过表达式我们知道 T(n)的时间复杂度为T(n/3),T(2n/3)以及n的时间复杂度之和,可用如下树形表示:
同理,T(n/3)=T(n/32)+T(22n/32)+n/3也以相同的形式表示在递归树中。以此类推,可得如下递归树:
因为时间复杂度要考虑最坏情况,所以应选择树中最长的路径,即:
n->(2/3)n->(2/3)2n->(2/3)3n->……->(3/2)kn
递归树中叶子结点要化为1,所以(2/3)kn=1,可以得到
k
=
l
o
g
2
/
3
n
k=log_{2/3}n
k=log2/3n.
递归树上所有结点的总和为
n
(
1
+
k
)
=
n
(
l
o
g
3
/
2
n
+
1
)
n(1+k)=n(log_{3/2}n+1)
n(1+k)=n(log3/2n+1).
根据时间复杂度的渐进性质与加法原理,可得:f(n)的时间复杂度为O(nlogn)。
本篇参考文章来源:http://www.cnblogs.com/wu8685/archive/2010/12/21/1912347.html