分治策略时间复杂度分析(三)-用递归树方法求解递归式
虽然以上两种方法都可以求解递归式,但是它们的缺点是比较复杂。所以我们提出第三种方法-主方法,这个方法可以快速求解,很容易地求解很多的递归式,通常不需要纸和笔的帮助。
前言
进行分治策略时间复杂度分析有三种方法,分别为
- 1.用代入法求解递归式
- 2.用递归树方法求解递归式
- 3.用主方法求解递归式
本篇文章介绍第三种方法,即用主方法来求解递归式。主方法为如下形式的递归式提供了一种“菜谱”式的求解方法:
T ( n ) = a T ( n / b ) + f ( n ) T(n)=aT(n/b)+f(n) T(n)=aT(n/b)+f(n)
其中 a ≥ 1 , b ≥ 1 a\geq1,b\geq1 a≥1,b≥1是常数,f(n)是渐近正函数。这个递归式描述的是这样一种算法的运行时间:它将规模为n的问题分解为a个子问题,每个子问题规模为n/b,其中a和b都是正常数。a个子问题递归地进行求解,每个花费时间T(n/b)。函数f(n)包含了问题分解和子问题解合并的代价
一、主定理
令
a
≥
1
和
b
>
1
a\geq1和b>1
a≥1和b>1是常数,f(n)是一个函数,T(n)是定义在非负整数上的递归式:
T
(
n
)
=
a
T
(
n
/
b
)
=
f
(
n
)
T(n)=aT(n/b)=f(n)
T(n)=aT(n/b)=f(n)
其中,我们将n/b解释为
⌊
n
/
b
⌋
和
⌈
n
/
b
⌉
\lfloor n/b\rfloor 和\lceil n/b\rceil
⌊n/b⌋和⌈n/b⌉。那么T(n)有如下的渐近界:
- 若对某个常数 ϵ > 0 \epsilon>0 ϵ>0,有 f ( n ) = O ( n l o g b a − ϵ ) f(n)=O(n^{log_ba-\epsilon}) f(n)=O(nlogba−ϵ),则 T ( n ) = Θ ( n l o g b a ) T(n)=\Theta(n^{log_ba}) T(n)=Θ(nlogba)
- 若 f ( n ) = Θ ( n l o g b a ) f(n)=\Theta(n^{log_ba}) f(n)=Θ(nlogba),则 T ( n ) = Θ ( n l o g b a l g n ) T(n)=\Theta(n^{log_ba}lgn) T(n)=Θ(nlogbalgn)
- 若对某个常数
ϵ
>
0
\epsilon>0
ϵ>0,有
f
(
n
)
=
Ω
(
n
l
o
g
b
a
+
ϵ
)
f(n)=\Omega(n^{log_ba+\epsilon})
f(n)=Ω(nlogba+ϵ),且对某个常数c<1和所有足够大的n有
a
f
(
n
/
b
)
≤
c
f
(
n
)
af(n/b)\leq cf(n)
af(n/b)≤cf(n),则
T
(
n
)
=
Θ
(
f
(
n
)
)
T(n)=\Theta(f(n))
T(n)=Θ(f(n))
在使用主定理之前,对于三种情况的每一种,我们将函数f(n)与函数 n l o g b a n^{log_ba} nlogba进行比较。直觉上,两个函数较大者决定了递归式的解,但是这种较大较小应该是多项式意义上的比较,而不是单纯的大小。
同时呢,还要注意第三种情况实际上也是有前提的,不过对于大多数情况来看,第三种往往都会满足。
二、很值得注意的反例!
主方法不能用于如下的递归式:
T
(
n
)
=
2
T
(
n
/
2
)
+
n
l
g
n
T(n)=2T(n/2)+nlgn
T(n)=2T(n/2)+nlgn
虽然这个递归式看起来有恰当的形式:a=2,b=2,f(n)=nlgn,以及
n
l
o
g
b
a
=
n
nlog_b a=n
nlogba=n。。你可能会错误地认为该情况适用于情况3,因为f(n)=nlgn渐近大于
n
l
o
g
b
a
=
n
n^{log_ba}=n
nlogba=n。问题出在它并不是多项式意义上的大于。对于任意的正常数
ϵ
\epsilon
ϵ,比值
f
(
n
)
/
n
l
o
g
b
a
=
(
n
l
g
n
)
/
n
=
l
g
n
f(n)/n^{log_ba}=(nlgn)/n=lgn
f(n)/nlogba=(nlgn)/n=lgn都渐近小于
n
ϵ
n^\epsilon
nϵ。因此,该递归式落入了情况2和情况3之间的间隙,根本不好用!
总结
主方法法是求递归式的一个很实用的方法,我在此做一个笔记,也希望可以帮助到你!
参考文档: 《算法导论》