主方法求解递归式
在分析递归的算法时,主方法可以较快的计算出算法的时间复杂度
主方法可以用于满足以下形式的递归式。
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>1
a≥1和b>1是常数,
f
(
n
)
f(n)
f(n)是渐进函数。
主方法描述的算法:将原本规模为
n
n
n的问题,分解为
a
a
a 个规模为
n
/
b
n/b
n/b 的子问题,其中
a
,
b
∈
Z
+
a,b\in \mathbb{Z^+}
a,b∈Z+,函数
f
(
n
)
f(n)
f(n) 包含了问题分解和子问题合并的代价。
下面是归并排序的递归式:
T
(
n
)
=
{
Θ
(
1
)
若
n
=
1
2
T
(
n
/
2
)
+
Θ
(
n
)
若
n
>
1
T(n)= \begin{cases} \Theta(1) & 若n=1 \\ 2T(n/2)+\Theta(n) & 若n>1 \\ \end{cases}
T(n)={Θ(1)2T(n/2)+Θ(n)若n=1若n>1
其中,
a
=
2
,
b
=
2
,
f
(
n
)
=
Θ
(
n
)
。
a=2,\ b=2,\ f(n)=\Theta(n)。
a=2, b=2, f(n)=Θ(n)。
在具体处理过程中,会遇到
n
/
b
n/b
n/b 可能不是整数的情况。可以将
a
a
a 项
T
(
n
/
b
)
T(n/b)
T(n/b)全都替换为
T
(
⌊
n
/
b
⌋
)
或
T
(
⌈
n
/
b
⌉
)
T(\lfloor n/b \rfloor)或T(\lceil n/b\rceil)
T(⌊n/b⌋)或T(⌈n/b⌉) 并不会影响递归式的渐进性质。
主定理
主定理:
a
≥
1
和
b
>
1
a\geq1和b>1
a≥1和b>1是常数,
f
(
n
)
f(n)
f(n)是一个函数,
T
(
n
)
T(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 解释为
⌊
n
/
b
⌋
或
⌈
n
/
b
⌉
\lfloor n/b \rfloor或\lceil n/b\rceil
⌊n/b⌋或⌈n/b⌉。那么
T
(
n
)
T(n)
T(n)有如下渐近界:
- 若对某个常数 ϵ > 0 \epsilon >0 ϵ>0有 f ( n ) = O ( n l o g b a − ϵ ) f(n)=\Omicron(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)=Θ(nlogba lgn)
- 若对某个常数 ϵ > 0 \epsilon>0 ϵ>0 有 f ( n ) = Ω ( n l o g b a + ϵ ) f(n)=\Omega(n^{log_ba+\epsilon}) f(n)=Ω(nlogba+ϵ),且对某个常数 c < 1 c<1 c<1 和所有足够大的 n n 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 ) f(n) f(n) 和函数 n l o g b a n^{log_ba} nlogba 进行比较。如情况1和情况3,两者的较大者决定了递归式的解。对于情况2,则再乘上一个对数因子 l g n lgn lgn ,解为 T ( n ) = Θ ( n l o a b a l g n ) = Θ ( f ( n ) l g n ) T(n)=\Theta(n^{loa_ba} \ lgn)=\Theta(f(n)\ lgn) T(n)=Θ(nloaba lgn)=Θ(f(n) lgn)。
注意: 对于第1种情况和第3种情况的
f
(
n
)
\mathbf{f(n)}
f(n) 渐进小于和渐进大于
n
l
o
g
b
a
\mathbf{n^{log_ba}}
nlogba,其中相差一个因子
n
ϵ
n^\epsilon
nϵ,其中
ϵ
\epsilon
ϵ为大于0的常数,即要满足 多项式的差距。同时第三种情况还要满足 "正则"条件
a
f
(
n
/
b
)
≤
c
f
(
n
)
af(n/b)\leq cf(n)
af(n/b)≤cf(n)。
这三种情况未覆盖
f
(
n
)
f(n)
f(n) 的所有可能性。 即
f
(
n
)
f(n)
f(n) 不满足多项式级别的渐进小于
n
l
o
g
b
a
n^{log_ba}
nlogba而处于情况1和情况2之间。同理,不满足
f
(
n
)
f(n)
f(n) 渐进大于而处于
n
l
o
g
b
a
n^{log_ba}
nlogba 而处于情况2和情况3之间,或则情况3而不满足正则条件,均不能使用主方法求解递归式。
主方法使用例子
1、
T
(
n
)
=
9
T
(
n
/
3
)
+
n
T(n)=9T(n/3)+ n
T(n)=9T(n/3)+n
其中
a
=
9
,
b
=
3
,
f
(
n
)
=
n
a=9,b=3,f(n)=n
a=9,b=3,f(n)=n。很容易求解
n
l
o
g
b
a
=
n
2
=
Θ
(
n
2
)
n^{log_ba}=n^2=\Theta(n^2)
nlogba=n2=Θ(n2)。
有
f
(
n
)
=
n
=
O
(
n
l
o
g
b
a
−
ϵ
)
f(n)=n=\Omicron( n^{log_ba-\epsilon})
f(n)=n=O(nlogba−ϵ),其中
ϵ
=
1
\epsilon=1
ϵ=1,故满足情况1,因此得出
T
(
n
)
=
Θ
(
n
2
)
T(n)=\Theta(n^2)
T(n)=Θ(n2)。
2、
T
(
n
)
=
T
(
2
n
/
3
)
+
1
T(n)=T(2n/3)+1
T(n)=T(2n/3)+1
其中
a
=
1
,
b
=
3
/
2
,
f
(
n
)
=
1
a=1,b=3/2,f(n)=1
a=1,b=3/2,f(n)=1。
n
l
o
g
b
a
=
n
l
o
g
3
/
2
1
=
Θ
(
1
)
n^{log_ba}=n^{log_{3/2}1}=\Theta(1)
nlogba=nlog3/21=Θ(1)。
有
f
(
n
)
=
Θ
(
n
l
o
g
b
a
)
=
Θ
(
1
)
f(n)=\Theta(n^{log_ba})=\Theta(1)
f(n)=Θ(nlogba)=Θ(1)。因此满足情况2,则
T
(
n
)
=
Θ
(
n
l
o
g
b
a
l
g
n
)
=
Θ
(
l
g
n
)
T(n)=\Theta(n^{log_ba} lgn)=\Theta(lgn)
T(n)=Θ(nlogbalgn)=Θ(lgn)。
3、
T
(
n
)
=
3
T
(
n
/
4
)
+
n
l
g
n
T(n)=3T(n/4)+nlgn
T(n)=3T(n/4)+nlgn
其中
a
=
3
,
b
=
4
,
f
(
n
)
=
n
l
g
n
a=3,b=4,f(n)=nlgn
a=3,b=4,f(n)=nlgn。
n
l
o
g
b
a
=
n
l
o
g
4
3
=
O
(
n
0.793
)
n^{log_ba}=n^{log_43}=\Omicron(n^{0.793})
nlogba=nlog43=O(n0.793)。由于
f
(
n
)
=
Ω
(
n
l
o
g
4
3
+
ϵ
)
f(n)=\Omega(n^{log_43+\epsilon})
f(n)=Ω(nlog43+ϵ),其中
ϵ
≈
0.2
\epsilon\approx0.2
ϵ≈0.2。
接下来证明正则条件,即
a
f
(
n
/
b
)
≤
c
f
(
n
)
3
(
n
/
4
)
l
g
(
n
/
4
)
≤
c
n
l
g
n
\begin{aligned} af(n/b) & \leq cf(n) \\ 3(n/4)lg(n/4) & \leq cnlgn\\ \end{aligned}
af(n/b)3(n/4)lg(n/4)≤cf(n)≤cnlgn
显然,当
c
=
3
/
4
c=3/4
c=3/4时,不等式成立。
故
T
(
n
)
=
Θ
(
f
(
n
)
)
=
Θ
(
n
l
g
n
)
T(n)=\Theta(f(n))=\Theta(nlgn)
T(n)=Θ(f(n))=Θ(nlgn)
下面这个递归式不能运用主方法
4、
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
)
=
n
l
g
n
a=2,b=2,f(n)=nlgn
a=2,b=2,f(n)=nlgn,
n
l
o
g
b
a
=
Θ
(
n
)
n^{log_ba}=\Theta(n)
nlogba=Θ(n),
可能会得到错误的结论有:
f
(
n
)
=
Ω
(
n
l
o
g
2
2
+
ϵ
)
f(n)=\Omega(n^{log_22+\epsilon})
f(n)=Ω(nlog22+ϵ)。然后继续求解下去。
实际上,不满足之前提到的情况1和情况3的渐进差距需要时多项式级别的。
即:
n
l
g
n
n
l
o
g
2
2
=
n
l
g
n
n
=
l
g
n
=
ο
(
n
ϵ
)
\frac{nlgn} {n^{log_22}}=\frac {nlgn} {n} = lgn = \omicron(n^\epsilon)
nlog22nlgn=nnlgn=lgn=ο(nϵ)
这里的 ο \mathbf\omicron ο 符号代表非渐进紧确的上界,
如: f ( n ) = ο ( g ( n ) ) f(n)=\omicron(g(n)) f(n)=ο(g(n)): ∀ c > 0 \forall c>0 ∀c>0, ∃ \exists ∃常量 n 0 > 0 n_0>0 n0>0,使得 ∀ n ≥ n 0 \forall n\geq n_0 ∀n≥n0,有 0 ≤ f ( n ) < c g ( n ) 0 \leq f(n) < cg(n) 0≤f(n)<cg(n)。简单理解小于但不等于。
即不满足多项式级别的大于。故处于情况2和情况3之间。不可以采用主方法求解。
练习题4.5-1: 建议自己动手做完后对照。
a.
T
(
n
)
=
2
T
(
n
/
4
)
+
1
T(n)=2T(n/4)+1
T(n)=2T(n/4)+1
其中
a
=
2
,
b
=
4
,
f
(
n
)
=
1
a=2,b=4,f(n)=1
a=2,b=4,f(n)=1,
n
l
o
g
b
a
=
n
n^{log_ba}= \sqrt n
nlogba=n。
有
f
(
n
)
=
O
(
n
l
o
g
b
a
−
ϵ
)
=
O
(
n
0.5
−
ϵ
)
f(n) = \Omicron(n^{log_ba-\epsilon}) = \Omicron(n^{0.5-\epsilon})
f(n)=O(nlogba−ϵ)=O(n0.5−ϵ),其中
ϵ
=
0.5
\epsilon = 0.5
ϵ=0.5。
故
T
(
n
)
=
Θ
(
n
l
o
g
4
2
)
=
Θ
(
n
)
T(n) = \Theta(n^{log_42}) = \Theta(\sqrt n)
T(n)=Θ(nlog42)=Θ(n)
b.
T
(
n
)
=
2
T
(
n
/
4
)
+
n
T(n)=2T(n/4)+\sqrt{n}
T(n)=2T(n/4)+n
同上,可以求出
n
l
o
g
b
a
n^{log_ba}
nlogba,由于
f
(
n
)
=
n
=
Θ
(
n
)
=
Θ
(
n
l
o
g
4
2
)
f(n) = \sqrt n =\Theta(\sqrt n) = \Theta(n^{log_42})
f(n)=n=Θ(n)=Θ(nlog42)
故
T
(
n
)
=
Θ
(
f
(
n
)
l
g
n
)
=
Θ
(
n
l
g
n
)
T(n) = \Theta( f(n)lgn) = \Theta(\sqrt n \ lgn)
T(n)=Θ(f(n)lgn)=Θ(n lgn)
c.
T
(
n
)
=
2
T
(
n
/
4
)
+
n
T(n)=2T(n/4)+n
T(n)=2T(n/4)+n
同上,求出
n
l
o
g
b
a
n^{log_ba}
nlogba,由于
f
(
n
)
=
Ω
(
n
0.5
+
ϵ
)
f(n) = \Omega(n^{0.5 + \epsilon})
f(n)=Ω(n0.5+ϵ), 其中
ϵ
=
0.5
\epsilon =0.5
ϵ=0.5。接下来证明正则条件:
a
f
(
n
/
b
)
≤
c
f
(
n
)
2
∗
(
n
/
4
)
≤
c
n
1
2
≤
c
\begin{aligned} a f(n /b) & \leq c f(n) \\ 2*(n/4) & \leq c \ n \\ \frac 1 2 & \leq c \end{aligned}
af(n/b)2∗(n/4)21≤cf(n)≤c n≤c
显然,取
c
=
1
2
c = \frac 1 2
c=21时,满足条件。故
T
(
n
)
=
Θ
(
f
(
n
)
)
=
Θ
(
n
)
T(n) = \Theta(f(n)) = \Theta(n)
T(n)=Θ(f(n))=Θ(n)。
d.
T
(
n
)
=
2
T
(
n
/
4
)
+
n
2
T(n)=2T(n/4)+n^2
T(n)=2T(n/4)+n2
同上,求出
n
l
o
g
b
a
n^{log_ba}
nlogba,由于
f
(
n
)
=
n
2
=
Ω
(
n
l
o
g
b
a
+
ϵ
)
f(n) = n^2 = \Omega(n^{logb_a+\epsilon})
f(n)=n2=Ω(nlogba+ϵ),其中
ϵ
=
1.5
\epsilon = 1.5
ϵ=1.5。下面证明正则条件:
a
f
(
n
/
b
)
≤
c
f
(
n
)
2
(
n
/
4
)
2
≤
c
n
2
n
2
/
8
≤
c
n
2
\begin{aligned} a f(n/b) & \leq c f(n) \\ 2 (n/4)^2 & \leq c \ n^2 \\ n^2/8 & \leq c \ n^2 \end{aligned}
af(n/b)2(n/4)2n2/8≤cf(n)≤c n2≤c n2
显然,取
c
=
1
/
8
c = 1/8
c=1/8 时,满足条件。故
T
(
n
)
=
Θ
(
f
(
n
)
)
=
Θ
(
n
2
)
T(n) = \Theta( f(n) ) = \Theta(n^2)
T(n)=Θ(f(n))=Θ(n2)。
参看文献:算法导论