算法导论第三版代码python实现与部分习题答案-第四章:分治策略(二)

4.4 递归树

一、 对于幂函数的复习

证明:3log⁡4n=nlog⁡433^{\log_4 n} = n^{\log_4 3}3log4n=nlog43

方法一:标准推导

3log⁡4n=3ln⁡nln⁡4(换底公式:log⁡4n=ln⁡nln⁡4)3^{\log_4 n} = 3^{\frac{\ln n}{\ln 4}} \quad \text{(换底公式:} \log_4 n = \frac{\ln n}{\ln 4} \text{)}3log4n=3ln4lnn(换底公式:log4n=ln4lnn

=(31ln⁡4)ln⁡n(幂的乘方法则:akm=(ak)m)= \left(3^{\frac{1}{\ln 4}}\right)^{\ln n} \quad \text{(幂的乘方法则:} a^{km} = (a^k)^m \text{)}=(3ln41)lnn(幂的乘方法则:akm=(ak)m

=(eln⁡3ln⁡4)ln⁡n(因为31ln⁡4=eln⁡3ln⁡4)= \left(e^{\frac{\ln 3}{\ln 4}}\right)^{\ln n} \quad \text{(因为} 3^{\frac{1}{\ln 4}} = e^{\frac{\ln 3}{\ln 4}} \text{)}=(eln4ln3)lnn(因为3ln41=eln4ln3

=eln⁡3ln⁡4⋅ln⁡n(幂的乘方法则:(ak)m=akm)= e^{\frac{\ln 3}{\ln 4} \cdot \ln n} \quad \text{(幂的乘方法则:} (a^k)^m = a^{km} \text{)}=eln4ln3lnn(幂的乘方法则:(ak)m=akm

=eln⁡n⋅ln⁡3ln⁡4(乘法交换律)= e^{\ln n \cdot \frac{\ln 3}{\ln 4}} \quad \text{(乘法交换律)}=elnnln4ln3(乘法交换律)

=(eln⁡n)ln⁡3ln⁡4(幂的乘方法则:akm=(ak)m)= \left(e^{\ln n}\right)^{\frac{\ln 3}{\ln 4}} \quad \text{(幂的乘方法则:} a^{km} = (a^k)^m \text{)}=(elnn)ln4ln3(幂的乘方法则:akm=(ak)m

=nln⁡3ln⁡4(指数还原:eln⁡n=n)= n^{\frac{\ln 3}{\ln 4}} \quad \text{(指数还原:} e^{\ln n} = n \text{)}=nln4ln3(指数还原:elnn=n

=nlog⁡43(换底公式:ln⁡3ln⁡4=log⁡43)= n^{\log_4 3} \quad \text{(换底公式:} \frac{\ln 3}{\ln 4} = \log_4 3 \text{)}=nlog43(换底公式:ln4ln3=log43

方法二:对数验证法

x=3log⁡4nx = 3^{\log_4 n}x=3log4n,两边取以4为底的对数:

log⁡4x=log⁡4(3log⁡4n)=(log⁡4n)⋅(log⁡43)(对数的幂法则)\log_4 x = \log_4(3^{\log_4 n}) = (\log_4 n) \cdot (\log_4 3) \quad \text{(对数的幂法则)}log4x=log4(3log4n)=(log4n)(log43)(对数的幂法则)

=(log⁡43)⋅(log⁡4n)(乘法交换律)= (\log_4 3) \cdot (\log_4 n) \quad \text{(乘法交换律)}=(log43)(log4n)(乘法交换律)

y=nlog⁡43y = n^{\log_4 3}y=nlog43,两边取以4为底的对数:

log⁡4y=log⁡4(nlog⁡43)=(log⁡43)⋅(log⁡4n)(对数的幂法则)\log_4 y = \log_4(n^{\log_4 3}) = (\log_4 3) \cdot (\log_4 n) \quad \text{(对数的幂法则)}log4y=log4(nlog43)=(log43)(log4n)(对数的幂法则)

因为 log⁡4x=log⁡4y\log_4 x = \log_4 ylog4x=log4y,所以 x=yx = yx=y,即:3log⁡4n=nlog⁡433^{\log_4 n} = n^{\log_4 3}3log4n=nlog43

幂对换公式的一般形式

alog⁡bn=nlog⁡ba(条件:a>0,a≠1,b>0,b≠1,n>0)a^{\log_b n} = n^{\log_b a} \quad \text{(条件:} a > 0, a \neq 1, b > 0, b \neq 1, n > 0 \text{)}alogbn=nlogba(条件:a>0,a=1,b>0,b=1,n>0

[!IMPORTANT]

常用公式回顾

log⁡ab=log⁡blog⁡a=ln⁡bln⁡a(换底公式)\log_a b = \frac{\log b}{\log a} = \frac{\ln b}{\ln a} \quad \text{(换底公式)}logab=logalogb=lnalnb(换底公式)

log⁡ab⋅log⁡bc=log⁡ac(对数的连乘)\log_a b \cdot \log_b c = \log_a c \quad \text{(对数的连乘)}logablogbc=logac(对数的连乘)

alog⁡bc=clog⁡ba(幂对换公式)a^{\log_b c} = c^{\log_b a} \quad \text{(幂对换公式)}alogbc=clogba(幂对换公式)

log⁡a(bc)=c⋅log⁡ab(对数的幂法则)\log_a(b^c) = c \cdot \log_a b \quad \text{(对数的幂法则)}loga(bc)=clogab(对数的幂法则)

ak⋅m=(ak)m(幂的乘方法则)a^{k \cdot m} = (a^k)^m \quad \text{(幂的乘方法则)}akm=(ak)m(幂的乘方法则)

二、数列求和相关
T(n)=cn2+316cn2+(316)2cn2+⋯+(316)log⁡4n−1cn2+Θ(nlog⁡43) T(n) = cn^2 + \frac{3}{16}cn^2 + \left(\frac{3}{16}\right)^2 cn^2 + \dots + \left(\frac{3}{16}\right)^{{\log_4 n}-1} cn^2 + \Theta(n^{\log_4 3}) \qquad T(n)=cn2+163cn2+(163)2cn2++(163)log4n1cn2+Θ(nlog43)

=∑i=0log⁡4n−1(316)icn2+Θ(nlog⁡43)/* 写成等比数列求和的形式 */ = \sum_{i=0}^{{\log_4 n}-1} \left(\frac{3}{16}\right)^i c n^2 + \Theta(n^{\log_4 3}) \qquad \text{/* 写成等比数列求和的形式 */} =i=0log4n1(163)icn2+Θ(nlog43)/* 写成等比数列求和的形式 */

<∑i=0∞(316)icn2+Θ(nlog⁡43)/* 用无穷级数和估计有限级数和,上界分析 */ < \sum_{i=0}^{\infty} \left(\frac{3}{16}\right)^i c n^2 + \Theta(n^{\log_4 3}) \qquad \text{/* 用无穷级数和估计有限级数和,上界分析 */} <i=0(163)icn2+Θ(nlog43)/* 用无穷级数和估计有限级数和,上界分析 */

=(∑i=0∞qi)cn2+Θ(nlog⁡43),q=316/* 设q=316,便于套用公式 */ = \left(\sum_{i=0}^{\infty} q^i\right) c n^2 + \Theta(n^{\log_4 3}),\quad q = \frac{3}{16} \qquad \text{/* 设$q = \frac{3}{16}$,便于套用公式 */} =(i=0qi)cn2+Θ(nlog43),q=163/* q=163,便于套用公式 */

=11−qcn2+Θ(nlog⁡43)/* 等比无穷级数求和公式:∑i=0∞qi=11−q,∣q∣<1 */ = \frac{1}{1-q} c n^2 + \Theta(n^{\log_4 3}) \qquad \text{/* 等比无穷级数求和公式:$\sum_{i=0}^{\infty} q^i = \frac{1}{1-q}$,$|q|<1$ */} =1q1cn2+Θ(nlog43)/* 等比无穷级数求和公式:i=0qi=1q1q<1 */

=1613cn2+Θ(nlog⁡43)/* 代入q的值,1−q=1−316=1316 */ = \frac{16}{13} c n^2 + \Theta(n^{\log_4 3}) \qquad \text{/* 代入$q$的值,$1-q = 1 - \frac{3}{16} = \frac{13}{16}$ */} =1316cn2+Θ(nlog43)/* 代入q的值,1q=1163=1613 */

=O(n2)/* n2项主导,渐进上界符号表示 */ = O(n^2) \qquad \text{/* $n^2$项主导,渐进上界符号表示 */} =O(n2)/* n2项主导,渐进上界符号表示 */

[!IMPORTANT]
∑i=0kqi=1−qk+11−q \sum_{i=0}^k q^i = \frac{1 - q^{k+1}}{1-q} i=0kqi=1q1qk+1

无穷等比数列求和公式
无穷等比数列指的是首项为 aaa,公比为 qqq,项数无限的数列:
a,  aq,  aq2,  aq3,  … a, \; aq, \; aq^2, \; aq^3, \; \ldots a,aq,aq2,aq3,

∣q∣<1|q| < 1q<1,无穷等比数列的和为:
S=a+aq+aq2+aq3+⋯=∑i=0∞aqi=a1−q S = a + aq + aq^2 + aq^3 + \cdots = \sum_{i=0}^{\infty} aq^i = \frac{a}{1-q} S=a+aq+aq2+aq3+=i=0aqi=1qa

其中:

  • aaa 为首项
  • qqq 为公比(∣q∣<1|q|<1q<1

推导过程:

S=a+aq+aq2+aq3+⋯S = a + aq + aq^2 + aq^3 + \cdotsS=a+aq+aq2+aq3+

SSS 两边同时乘以 qqq
qS=aq+aq2+aq3+⋯ qS = aq + aq^2 + aq^3 + \cdots qS=aq+aq2+aq3+

两式相减:
S−qS=aS(1−q)=aS=a1−q S - qS = a \\ S(1-q) = a \\ S = \frac{a}{1-q} SqS=aS(1q)=aS=1qa


注意:

  • 只有当 ∣q∣<1|q|<1q<1 时,级数才收敛,有和公式。
  • ∣q∣≥1|q|\geq 1q1,级数发散,无和。

设无穷等比级数的部分和为 Sn=a+aq+aq2+⋯+aqn=a⋅1−qn+11−qS_n = a + aq + aq^2 + \cdots + aq^n = a \cdot \frac{1 - q^{n+1}}{1-q}Sn=a+aq+aq2++aqn=a1q1qn+1q≠1q \neq 1q=1

∣q∣<1|q|<1q<1qn+1→0q^{n+1} \to 0qn+10,所以 lim⁡n→∞Sn=a1−q\displaystyle \lim_{n\to\infty} S_n = \frac{a}{1-q}nlimSn=1qa,极限存在,级数收敛。

∣q∣>1|q|>1q>1∣qn+1∣→∞|q^{n+1}| \to \inftyqn+1SnS_nSn 不存在有限极限,级数发散。

q=1q=1q=1Sn=a(n+1)→∞S_n = a(n+1) \to \inftySn=a(n+1),级数发散。

q=−1q=-1q=1SnS_nSnaaa000 之间振荡,无极限,级数发散。

因此,只有 ∣q∣<1|q|<1q<1 时无穷等比级数收敛,其余情况均发散。

对于无穷级数 ∑n=0∞an\sum_{n=0}^\infty a_nn=0an,我们考察它的部分和 SN=∑n=0NanS_N = \sum_{n=0}^N a_nSN=n=0Nan

  • 如果 lim⁡N→∞SN\displaystyle \lim_{N\to\infty} S_NNlimSN 存在且为有限实数(不是无穷大,也不是震荡),则称级数收敛。
  • 如果极限不存在,或者极限为无穷大或无界,或者部分和在多个值之间震荡,则称级数发散。

因此,极限存在且有限   ⟺  \iff 级数收敛;极限不存在或为无穷大   ⟺  \iff 级数发散。

[!NOTE]

有限项等比数列求和公式

有限项等比数列是指首项为 aaa,公比为 qqq,共 n+1n+1n+1 项的数列:
a,  aq,  aq2,  …,  aqn a, \; aq, \; aq^2, \; \ldots, \; aq^n a,aq,aq2,,aqn

有限等比级数的和:
S=a+aq+aq2+⋯+aqn=∑i=0naqi=a⋅1−qn+11−q(q≠1) S = a + aq + aq^2 + \cdots + aq^n = \sum_{i=0}^{n} aq^i = a \cdot \frac{1 - q^{n+1}}{1-q} \qquad (q \neq 1) S=a+aq+aq2++aqn=i=0naqi=a1q1qn+1(q=1)

其中:

  • aaa 为首项
  • qqq 为公比
  • n+1n+1n+1 为项数

[!IMPORTANT]

几何级数复习

基本定义

什么是几何级数?

几何级数(等比数列的前 nnn 项和)是指形如: a+ar+ar2+ar3+⋯+arn−1a + ar + ar^2 + ar^3 + \cdots + ar^{n-1}a+ar+ar2+ar3++arn1

其中:

  • aaa 是首项
  • rrr 是公比(公比不等于0)
  • nnn 是项数

标准形式

∑i=0n−1ari=a+ar+ar2+⋯+arn−1\sum_{i=0}^{n-1} ar^i = a + ar + ar^2 + \cdots + ar^{n-1}i=0n1ari=a+ar+ar2++arn1

求和公式

aaa是首项 rrr是公比 nnn是项数

有限几何级数求和公式

r≠1r \neq 1r=1 时: ∑i=0n−1ari=a⋅1−rn1−r=a⋅rn−1r−1\sum_{i=0}^{n-1} ar^i = a \cdot \frac{1 - r^n}{1 - r} = a \cdot \frac{r^n - 1}{r - 1}i=0n1ari=a1r1rn=ar1rn1

推导过程: 设 S=a+ar+ar2+⋯+arn−1S = a + ar + ar^2 + \cdots + ar^{n-1}S=a+ar+ar2++arn1

两边同时乘以 rrrrS=ar+ar2+ar3+⋯+arnrS = ar + ar^2 + ar^3 + \cdots + ar^nrS=ar+ar2+ar3++arn

两式相减: S−rS=a−arnS - rS = a - ar^nSrS=aarn (1−r)S=a(1−rn)(1-r)S = a(1-r^n)(1r)S=a(1rn) S=a⋅1−rn1−rS = a \cdot \frac{1-r^n}{1-r}S=a1r1rn

无穷几何级数

∣r∣<1|r| < 1r<1 时,无穷级数收敛: ∑i=0∞ari=a1−r\sum_{i=0}^{\infty} ar^i = \frac{a}{1-r}i=0ari=1ra

从第1项开始的级数

∑i=1nari=ar⋅1−rn1−r\sum_{i=1}^{n} ar^i = ar \cdot \frac{1-r^n}{1-r}i=1nari=ar1r1rn

方法一:提取公因子
∑i=1nari=ar+ar2+ar3+⋯+arn\sum_{i=1}^{n} ar^i = ar + ar^2 + ar^3 + \cdots + ar^ni=1nari=ar+ar2+ar3++arn

提取 ararar
=ar(1+r+r2+⋯+rn−1)= ar(1 + r + r^2 + \cdots + r^{n-1})=ar(1+r+r2++rn1)
=ar∑i=0n−1ri= ar \sum_{i=0}^{n-1} r^i=ari=0n1ri

应用基础公式(a=1a=1a=1):
=ar⋅1−rn1−r= ar \cdot \frac{1-r^n}{1-r}=ar1r1rn

方法二:利用级数分割
∑i=1nari=∑i=0nari−∑i=00ari\sum_{i=1}^{n} ar^i = \sum_{i=0}^{n} ar^i - \sum_{i=0}^{0} ar^ii=1nari=i=0narii=00ari
=∑i=0nari−a= \sum_{i=0}^{n} ar^i - a=i=0naria
=a⋅1−rn+11−r−a= a \cdot \frac{1-r^{n+1}}{1-r} - a=a1r1rn+1a
=a(1−rn+11−r−1)= a\left(\frac{1-r^{n+1}}{1-r} - 1\right)=a(1r1rn+11)
=a(1−rn+1−(1−r)1−r)= a\left(\frac{1-r^{n+1} - (1-r)}{1-r}\right)=a(1r1rn+1(1r))
=a(1−rn+1−1+r1−r)= a\left(\frac{1-r^{n+1} - 1 + r}{1-r}\right)=a(1r1rn+11+r)
=a(r−rn+11−r)= a\left(\frac{r - r^{n+1}}{1-r}\right)=a(1rrrn+1)
=a(r(1−rn)1−r)= a\left(\frac{r(1 - r^n)}{1-r}\right)=a(1rr(1rn))
=ar⋅1−rn1−r= ar \cdot \frac{1-r^n}{1-r}=ar1r1rn

Exercise 4.4-1

题目:对递归式 T(n)=3T(⌊n/2⌋)+nT(n) = 3T(\lfloor n/2 \rfloor) + nT(n)=3T(⌊n/2⌋)+n,利用递归树确定一个好的渐近上界,用代入法进行验证。

递归树的结构:

  • 树的深度:每次递归问题规模从 nnn 变为 n/2n/2n/2,因此深度为 lg⁡n\lg nlgn(lg是以2为底)

[!NOTE]

当达到基础情况时,问题规模为 1, 也就是n2k=1\frac{n}{2^k} = 12kn=1

解这个方程: 2k=n2^k = n2k=n k=log⁡2n=lg⁡nk = \log_2 n = \lg nk=log2n=lgn 因此,递归树的深度确实是 lg⁡n\lg nlgn

[!WARNING]

深度 vs 层数的区别

标准定义

  • 深度(depth):从根节点到叶节点的边数
  • 层数(level):节点所在的层级编号(根节点为第0层)
  • iii 层节点数3i3^i3i(每个节点分解为3个子问题)
  • iii 层每个节点的代价n/2in/2^in/2i(递归式中的线性项)
  • iii 层总代价3i×n2i=n⋅(3/2)i3^i \times \frac{n}{2^i} = n \cdot (3/2)^i3i×2in=n(3/2)i

总代价计算

T(n)=∑i=0lg⁡nn⋅(32)i=n∑i=0lg⁡n(32)iT(n) = \sum_{i=0}^{\lg n} n \cdot \left(\frac{3}{2}\right)^i = n \sum_{i=0}^{\lg n} \left(\frac{3}{2}\right)^iT(n)=i=0lgnn(23)i=ni=0lgn(23)i

使用几何级数公式 ∑i=0kri=rk+1−1r−1\sum_{i=0}^{k} r^i = \frac{r^{k+1} - 1}{r - 1}i=0kri=r1rk+11

=n⋅(3/2)lg⁡n+1−13/2−1=2n[(3/2)lg⁡n+1−1]= n \cdot \frac{(3/2)^{\lg n + 1} - 1}{3/2 - 1} = 2n[(3/2)^{\lg n + 1} - 1]=n3/21(3/2)lgn+11=2n[(3/2)lgn+11]

关键计算(3/2)lg⁡n(3/2)^{\lg n}(3/2)lgn 的值

使用换底公式和幂对换公式 alog⁡bc=clog⁡baa^{\log_b c} = c^{\log_b a}alogbc=clogba
(3/2)lg⁡n=(3/2)log⁡2n=nlog⁡2(3/2)=nlg⁡3−lg⁡2=nlg⁡3−1=nlg⁡3n(3/2)^{\lg n} = (3/2)^{\log_2 n} = n^{\log_2(3/2)} = n^{\lg 3 - \lg 2} = n^{\lg 3 - 1} = \frac{n^{\lg 3}}{n}(3/2)lgn=(3/2)log2n=nlog2(3/2)=nlg3lg2=nlg31=nnlg3

因此
(3/2)lg⁡n+1=32⋅nlg⁡3n=3nlg⁡32n(3/2)^{\lg n + 1} = \frac{3}{2} \cdot \frac{n^{\lg 3}}{n} = \frac{3n^{\lg 3}}{2n}(3/2)lgn+1=23nnlg3=2n3nlg3

主导项分析
T(n)=2n[3nlg⁡32n−1]=3nlg⁡3−2nT(n) = 2n\left[\frac{3n^{\lg 3}}{2n} - 1\right] = 3n^{\lg 3} - 2nT(n)=2n[2n3nlg31]=3nlg32n

主导项为:T(n)=Θ(nlg⁡3)T(n) = \Theta(n^{\lg 3})T(n)=Θ(nlg3),其中 lg⁡3≈1.585\lg 3 \approx 1.585lg31.585

[!TIP]

1.1 强化假设技巧

技巧描述

当简单假设无法完成归纳时,添加低阶修正项。

基本模式
  • 简单形式T(n)≤cnkT(n) \leq cn^kT(n)cnk
  • 强化形式T(n)≤cnk−dnk−1T(n) \leq cn^k - dn^{k-1}T(n)cnkdnk1
应用场景

递归式形如 T(n)=aT(n/b)+f(n)T(n) = aT(n/b) + f(n)T(n)=aT(n/b)+f(n),且主导项来自递归部分时。

示例

递归式T(n)=4T(n/2)+nT(n) = 4T(n/2) + nT(n)=4T(n/2)+n

  • 简单假设 T(n)≤cn2T(n) \leq cn^2T(n)cn2 会多出 +n+n+n
  • 强化为 T(n)≤cn2−dnT(n) \leq cn^2 - dnT(n)cn2dn 可以用 −dn-dndn 抵消 +n+n+n

代入法验证

T(n)≤cnlg⁡3−dnT(n) \leq c n^{\lg 3} - d nT(n)cnlg3dn,其中 c,d>0c, d > 0c,d>0

T(n)=3T(⌊n/2⌋)+nT(n) = 3T(\lfloor n/2 \rfloor) + nT(n)=3T(⌊n/2⌋)+n

≤3[c(⌊n/2⌋)lg⁡3−d⌊n/2⌋]+n\leq 3[c(\lfloor n/2 \rfloor)^{\lg 3} - d \lfloor n/2 \rfloor] + n3[c(⌊n/2)lg3dn/2⌋]+n

处理取整项:由于 ⌊n/2⌋≤n/2\lfloor n/2 \rfloor \leq n/2n/2n/2,有 (⌊n/2⌋)lg⁡3≤(n/2)lg⁡3(\lfloor n/2 \rfloor)^{\lg 3} \leq (n/2)^{\lg 3}(⌊n/2)lg3(n/2)lg3

≤3[c⋅nlg⁡32lg⁡3−d⌊n/2⌋]+n\leq 3\left[c \cdot \frac{n^{\lg 3}}{2^{\lg 3}} - d \lfloor n/2 \rfloor\right] + n3[c2lg3nlg3dn/2]+n

由于 2lg⁡3=32^{\lg 3} = 32lg3=3

=3[c⋅nlg⁡33−d⌊n/2⌋]+n=cnlg⁡3−3d⌊n/2⌋+n= 3\left[c \cdot \frac{n^{\lg 3}}{3} - d \lfloor n/2 \rfloor\right] + n = c n^{\lg 3} - 3d \lfloor n/2 \rfloor + n=3[c3nlg3dn/2]+n=cnlg33dn/2+n

进一步估算:当 nnn 足够大时,⌊n/2⌋≥n/2−1\lfloor n/2 \rfloor \geq n/2 - 1n/2n/21,所以:

−3d⌊n/2⌋≤−3d(n/2−1)=−3dn2+3d-3d \lfloor n/2 \rfloor \leq -3d(n/2 - 1) = -\frac{3dn}{2} + 3d3dn/23d(n/21)=23dn+3d

因此
T(n)≤cnlg⁡3−3dn2+3d+n=cnlg⁡3+n(1−3d2)+3dT(n) \leq c n^{\lg 3} - \frac{3dn}{2} + 3d + n = c n^{\lg 3} + n\left(1 - \frac{3d}{2}\right) + 3dT(n)cnlg323dn+3d+n=cnlg3+n(123d)+3d

设置约束:要使 T(n)≤cnlg⁡3−dnT(n) \leq c n^{\lg 3} - d nT(n)cnlg3dn,当 nnn 足够大时(常数项可忽略),需要:

1−3d2≤−d1 - \frac{3d}{2} \leq -d123dd
1≤3d2−d=d21 \leq \frac{3d}{2} - d = \frac{d}{2}123dd=2d
d≥2d \geq 2d2

d≥2d \geq 2d2 时成立,因此 T(n)=O(nlg⁡3)T(n) = O(n^{\lg 3})T(n)=O(nlg3)

[!NOTE]

x−1<⌊x⌋≤xx - 1 < \lfloor x \rfloor \leq xx1<xx


Exercise 4.4-2

题目:对递归式 T(n)=T(n/2)+n2T(n) = T(n/2) + n^2T(n)=T(n/2)+n2,利用递归树确定一个好的渐近上界,用代入法进行验证。

递归树分析

递归树的结构:

  • 树的深度lg⁡n\lg nlgn
  • iii 层节点数:1(只有一个递归分支)
  • iii 层节点的代价(n/2i)2=n2/4i(n/2^i)^2 = n^2/4^i(n/2i)2=n2/4i

总代价计算

T(n)=∑i=0lg⁡nn24i=n2∑i=0lg⁡n(14)iT(n) = \sum_{i=0}^{\lg n} \frac{n^2}{4^i} = n^2 \sum_{i=0}^{\lg n} \left(\frac{1}{4}\right)^iT(n)=i=0lgn4in2=n2i=0lgn(41)i

使用几何级数公式:
=n2⋅1−(1/4)lg⁡n+11−1/4=n2⋅1−(1/4)lg⁡n+13/4=4n23[1−(1/4)lg⁡n+1]= n^2 \cdot \frac{1 - (1/4)^{\lg n + 1}}{1 - 1/4} = n^2 \cdot \frac{1 - (1/4)^{\lg n + 1}}{3/4} = \frac{4n^2}{3}[1 - (1/4)^{\lg n + 1}]=n211/41(1/4)lgn+1=n23/41(1/4)lgn+1=34n2[1(1/4)lgn+1]

关键计算(1/4)lg⁡n+1(1/4)^{\lg n + 1}(1/4)lgn+1 的值

使用换底公式:
(1/4)lg⁡n=(1/4)log⁡2n=nlog⁡2(1/4)=nlog⁡2(2−2)=n−2=1n2(1/4)^{\lg n} = (1/4)^{\log_2 n} = n^{\log_2(1/4)} = n^{\log_2(2^{-2})} = n^{-2} = \frac{1}{n^2}(1/4)lgn=(1/4)log2n=nlog2(1/4)=nlog2(22)=n2=n21

因此
(1/4)lg⁡n+1=14⋅(1/4)lg⁡n=14⋅1n2=14n2(1/4)^{\lg n + 1} = \frac{1}{4} \cdot (1/4)^{\lg n} = \frac{1}{4} \cdot \frac{1}{n^2} = \frac{1}{4n^2}(1/4)lgn+1=41(1/4)lgn=41n21=4n21

主导项计算
T(n)=4n23[1−14n2]=4n23−13T(n) = \frac{4n^2}{3}\left[1 - \frac{1}{4n^2}\right] = \frac{4n^2}{3} - \frac{1}{3}T(n)=34n2[14n21]=34n231

主导项为:T(n)=4n23−13=O(n2)T(n) = \frac{4n^2}{3} - \frac{1}{3} = O(n^2)T(n)=34n231=O(n2)

代入法验证

T(n)≤cn2T(n) \leq c n^2T(n)cn2

T(n)=T(n/2)+n2≤c(n/2)2+n2=cn24+n2=(c4+1)n2T(n) = T(n/2) + n^2 \leq c(n/2)^2 + n^2 = \frac{cn^2}{4} + n^2 = \left(\frac{c}{4} + 1\right)n^2T(n)=T(n/2)+n2c(n/2)2+n2=4cn2+n2=(4c+1)n2

要使 T(n)≤cn2T(n) \leq c n^2T(n)cn2,需要:
c4+1≤c\frac{c}{4} + 1 \leq c4c+1c
1≤c−c4=3c41 \leq c - \frac{c}{4} = \frac{3c}{4}1c4c=43c
43≤c\frac{4}{3} \leq c34c

c≥4/3c \geq 4/3c4/3 时成立,因此 T(n)=O(n2)T(n) = O(n^2)T(n)=O(n2)


Exercise 4.4-3

题目:对递归式 T(n)=4T(n/2+2)+nT(n) = 4T(n/2 + 2) + nT(n)=4T(n/2+2)+n,利用递归树确定一个好的渐近上界,用代入法进行验证。

递归树分析

递归树的结构:

  • 树的深度:约为 lg⁡n\lg nlgn
  • iii 层节点数4i4^i4i
  • iii 层每个节点的规模:约为 n/2in/2^in/2i(忽略常数项+2的影响)
  • iii 层总代价:约为 4i×n2i=n⋅2i4^i \times \frac{n}{2^i} = n \cdot 2^i4i×2in=n2i

总代价计算

T(n)≈∑i=0lg⁡nn⋅2i=n∑i=0lg⁡n2i=n(2lg⁡n+1−1)=n(2n−1)=O(n2)T(n) \approx \sum_{i=0}^{\lg n} n \cdot 2^i = n \sum_{i=0}^{\lg n} 2^i = n(2^{\lg n + 1} - 1) = n(2n - 1) = O(n^2)T(n)i=0lgnn2i=ni=0lgn2i=n(2lgn+11)=n(2n1)=O(n2)

代入法验证

T(n)≤cn2−dnT(n) \leq c n^2 - d nT(n)cn2dn,其中 c,d>0c, d > 0c,d>0

T(n)=4T(n/2+2)+nT(n) = 4T(n/2 + 2) + nT(n)=4T(n/2+2)+n

m=n/2+2m = n/2 + 2m=n/2+2,则:
T(n)≤4[cm2−dm]+n=4c(n/2+2)2−4d(n/2+2)+nT(n) \leq 4[c m^2 - d m] + n = 4c(n/2 + 2)^2 - 4d(n/2 + 2) + nT(n)4[cm2dm]+n=4c(n/2+2)24d(n/2+2)+n

展开 (n/2+2)2=n2/4+2n+4(n/2 + 2)^2 = n^2/4 + 2n + 4(n/2+2)2=n2/4+2n+4
=4c(n24+2n+4)−4d(n2+2)+n= 4c\left(\frac{n^2}{4} + 2n + 4\right) - 4d\left(\frac{n}{2} + 2\right) + n=4c(4n2+2n+4)4d(2n+2)+n

=cn2+8cn+16c−2dn−8d+n= c n^2 + 8cn + 16c - 2dn - 8d + n=cn2+8cn+16c2dn8d+n

=cn2+n(8c−2d+1)+(16c−8d)= c n^2 + n(8c - 2d + 1) + (16c - 8d)=cn2+n(8c2d+1)+(16c8d)

要使 T(n)≤cn2−dnT(n) \leq c n^2 - d nT(n)cn2dn,需要
n(8c−2d+1)+(16c−8d)≤−dnn(8c - 2d + 1) + (16c - 8d) \leq -dnn(8c2d+1)+(16c8d)dn

整理得
n(8c−2d+1+d)+(16c−8d)≤0n(8c - 2d + 1 + d) + (16c - 8d) \leq 0n(8c2d+1+d)+(16c8d)0
n(8c−d+1)+(16c−8d)≤0n(8c - d + 1) + (16c - 8d) \leq 0n(8cd+1)+(16c8d)0

这要求

  1. 线性项系数8c−d+1≤08c - d + 1 \leq 08cd+10,即 d≥8c+1d \geq 8c + 1d8c+1
  2. 常数项16c−8d≤016c - 8d \leq 016c8d0,即 d≥2cd \geq 2cd2c

综合约束d≥max⁡(8c+1,2c)d \geq \max(8c + 1, 2c)dmax(8c+1,2c)

c≥1/6c \geq 1/6c1/6 时,8c+1≥2c8c + 1 \geq 2c8c+12c,所以需要 d≥8c+1d \geq 8c + 1d8c+1

参数选择:取 c=1,d=9c = 1, d = 9c=1,d=9,满足 d=8c+1d = 8c + 1d=8c+1d>2cd > 2cd>2c

因此 T(n)=O(n2)T(n) = O(n^2)T(n)=O(n2)


Exercise 4.4-4

题目:对递归式 T(n)=2T(n−1)+1T(n) = 2T(n-1) + 1T(n)=2T(n1)+1,利用递归树确定一个好的渐近上界,用代入法进行验证。

递归树分析

递归树的结构:

  • 树的深度nnn(每次递归减1)
  • iii 层节点数2i2^i2i
  • 每个节点的代价:1

总代价计算

T(n)=∑i=0n−12i⋅1=∑i=0n−12i=2n−1=O(2n)T(n) = \sum_{i=0}^{n-1} 2^i \cdot 1 = \sum_{i=0}^{n-1} 2^i = 2^n - 1 = O(2^n)T(n)=i=0n12i1=i=0n12i=2n1=O(2n)

代入法验证

T(n)≤2n−1T(n) \leq 2^n - 1T(n)2n1

T(n)=2T(n−1)+1≤2(2n−1−1)+1=2n−2+1=2n−1T(n) = 2T(n-1) + 1 \leq 2(2^{n-1} - 1) + 1 = 2^n - 2 + 1 = 2^n - 1T(n)=2T(n1)+12(2n11)+1=2n2+1=2n1

假设成立,因此 T(n)=O(2n)T(n) = O(2^n)T(n)=O(2n)


Exercise 4.4-5

题目:对递归式 T(n)=T(n−1)+T(n/2)+nT(n) = T(n-1) + T(n/2) + nT(n)=T(n1)+T(n/2)+n,利用递归树确定一个好的渐近上界,用代入法进行验证。

递归树分析

递归树看起来像一个长分支,从它分出的分支直接跳到一半。这看起来是一个相当满的树,我们猜测运行时间为 O(2n)O(2^n)O(2n)

代入法验证上界

第一次尝试:设 T(n)≤2nT(n) \leq 2^nT(n)2n

T(n)=T(n−1)+T(n/2)+n≤2n−1+2n/2+nT(n) = T(n-1) + T(n/2) + n \leq 2^{n-1} + 2^{n/2} + nT(n)=T(n1)+T(n/2)+n2n1+2n/2+n

问题:2n−1+2n/2+n2^{n-1} + 2^{n/2} + n2n1+2n/2+n 不一定 ≤2n\leq 2^n2n,因为我们有额外的 2n/2+n2^{n/2} + n2n/2+n 项。

强化假设:设 T(n)≤2n−an−bT(n) \leq 2^n - an - bT(n)2nanb,其中 a,b>0a, b > 0a,b>0

T(n)=T(n−1)+T(n/2)+nT(n) = T(n-1) + T(n/2) + nT(n)=T(n1)+T(n/2)+n

≤[2n−1−a(n−1)−b]+[2n/2−a(n/2)−b]+n\leq [2^{n-1} - a(n-1) - b] + [2^{n/2} - a(n/2) - b] + n[2n1a(n1)b]+[2n/2a(n/2)b]+n

=2n−1+2n/2−a(n−1)−a(n/2)−2b+n= 2^{n-1} + 2^{n/2} - a(n-1) - a(n/2) - 2b + n=2n1+2n/2a(n1)a(n/2)2b+n

=2n−1+2n/2−an+a−an2−2b+n= 2^{n-1} + 2^{n/2} - an + a - \frac{an}{2} - 2b + n=2n1+2n/2an+a2an2b+n

=2n−1+2n/2−3an2+a−2b+n= 2^{n-1} + 2^{n/2} - \frac{3an}{2} + a - 2b + n=2n1+2n/223an+a2b+n

=2n−1+2n/2+n(1−3a2)+(a−2b)= 2^{n-1} + 2^{n/2} + n\left(1 - \frac{3a}{2}\right) + (a - 2b)=2n1+2n/2+n(123a)+(a2b)

要使结果 ≤2n−an−b\leq 2^n - an - b2nanb,需要:
2n−1+2n/2+n(1−3a2)+(a−2b)≤2n−an−b2^{n-1} + 2^{n/2} + n\left(1 - \frac{3a}{2}\right) + (a - 2b) \leq 2^n - an - b2n1+2n/2+n(123a)+(a2b)2nanb

分析约束条件

  1. 指数项:当 nnn 足够大时,2n/2≪2n−12^{n/2} \ll 2^{n-1}2n/22n1,所以:
    2n−1+2n/2≤2n−1+ε⋅2n−1=(1+ε)⋅2n−12^{n-1} + 2^{n/2} \leq 2^{n-1} + \varepsilon \cdot 2^{n-1} = (1+\varepsilon) \cdot 2^{n-1}2n1+2n/22n1+ε2n1=(1+ε)2n1

    其中 ε\varepsilonε 是任意小的正数。要使 (1+ε)⋅2n−1≤2n=2⋅2n−1(1+\varepsilon) \cdot 2^{n-1} \leq 2^n = 2 \cdot 2^{n-1}(1+ε)2n12n=22n1,需要 1+ε≤21+\varepsilon \leq 21+ε2,这在 nnn 足够大时成立。

  2. 线性项:需要 1−3a2≤−a1 - \frac{3a}{2} \leq -a123aa,即:
    1≤3a2−a=a21 \leq \frac{3a}{2} - a = \frac{a}{2}123aa=2a
    a≥2a \geq 2a2

  3. 常数项:需要 a−2b≤−ba - 2b \leq -ba2bb,即:
    a≤ba \leq bab

参数选择:取 a=2,b=2a = 2, b = 2a=2,b=2,满足所有约束条件。

多项式上界的否定

假设 T(n)≤cnkT(n) \leq cn^kT(n)cnk,代入递归式:
T(n)≤c(n−1)k+c(n/2)k+nT(n) \leq c(n-1)^k + c(n/2)^k + nT(n)c(n1)k+c(n/2)k+n

nnn 足够大时,(n−1)k≈nk(n-1)^k \approx n^k(n1)knk
≤cnk+cnk2k+n=cnk(1+12k)+n\leq cn^k + \frac{cn^k}{2^k} + n = cn^k\left(1 + \frac{1}{2^k}\right) + ncnk+2kcnk+n=cnk(1+2k1)+n

nkn^knk 的系数为 c(1+12k)>cc\left(1 + \frac{1}{2^k}\right) > cc(1+2k1)>c,这违反了 T(n)≤cnkT(n) \leq cn^kT(n)cnk 的假设。

因此不存在多项式上界,T(n)=O(2n)T(n) = O(2^n)T(n)=O(2n)

基础情况验证

需要验证小的 nnn 值满足 T(n)≤2n−2n−2T(n) \leq 2^n - 2n - 2T(n)2n2n2,并调整参数以确保基础情况成立。

因此 T(n)=O(2n)T(n) = O(2^n)T(n)=O(2n)


Exercise 4.4-6

题目:对递归式 T(n)=T(n/3)+T(2n/3)+cnT(n) = T(n/3) + T(2n/3) + cnT(n)=T(n/3)+T(2n/3)+cn,利用递归树论证其解为 Ω(nlg⁡n)\Omega(n \lg n)Ω(nlgn),其中 ccc 为常数。

递归树分析

递归树每一层的代价分析:

  • 第 0 层:1个节点,代价 cncncn
  • 第 1 层:2个节点,代价 c(n/3)+c(2n/3)=cnc(n/3) + c(2n/3) = cnc(n/3)+c(2n/3)=cn
  • 第 2 层:4个节点,总代价仍为 cncncn

每一层的总代价都是 cncncn

下界分析

最短路径:从根到叶的最短路径通过每次选择较小的子问题 T(n/3)T(n/3)T(n/3)n→n/3→n/9→n/27→⋯→1n \to n/3 \to n/9 \to n/27 \to \cdots \to 1nn/3n/9n/271

路径长度为 log⁡3n\log_3 nlog3n,因此树的高度至少为 log⁡3n\log_3 nlog3n

总代价下界T(n)≥cn⋅(log⁡3n+1)≥cnlog⁡3n=c⋅ln⁡nln⁡3⋅n=cln⁡3nln⁡n=Ω(nlg⁡n)T(n) \geq cn \cdot (\log_3 n + 1) \geq cn \log_3 n = c \cdot \frac{\ln n}{\ln 3} \cdot n = \frac{c}{\ln 3} n \ln n = \Omega(n \lg n)T(n)cn(log3n+1)cnlog3n=cln3lnnn=ln3cnlnn=Ω(nlgn)


Exercise 4.4-7

题目:对递归式 T(n)=4T(⌊n/2⌋)+cnT(n) = 4T(\lfloor n/2 \rfloor) + cnT(n)=4T(⌊n/2⌋)+cnccc 为常数),画出递归树,并给出其解的一个渐近紧确界。用代入法进行验证。

递归树分析

递归树的结构:

  • iii 层节点数4i4^i4i
  • iii 层每个节点的代价c⋅n/2ic \cdot n/2^icn/2i
  • iii 层总代价4i⋅cn2i=cn⋅2i4^i \cdot \frac{cn}{2^i} = cn \cdot 2^i4i2icn=cn2i
  • 树的深度lg⁡n\lg nlgn

总代价计算

T(n)=∑i=0lg⁡ncn⋅2i=cn∑i=0lg⁡n2i=cn(2lg⁡n+1−1)=cn(2n−1)=O(n2)T(n) = \sum_{i=0}^{\lg n} cn \cdot 2^i = cn \sum_{i=0}^{\lg n} 2^i = cn(2^{\lg n + 1} - 1) = cn(2n - 1) = O(n^2)T(n)=i=0lgncn2i=cni=0lgn2i=cn(2lgn+11)=cn(2n1)=O(n2)

上界验证

T(n)≤c′n2−dnT(n) \leq c' n^2 - d nT(n)cn2dn

T(n)=4T(⌊n/2⌋)+cn≤4[c′(n2)2−d(n2)]+cnT(n) = 4T(\lfloor n/2 \rfloor) + cn \leq 4\left[c'\left(\frac{n}{2}\right)^2 - d\left(\frac{n}{2}\right)\right] + cnT(n)=4T(⌊n/2⌋)+cn4[c(2n)2d(2n)]+cn

=4[c′n24−dn2]+cn=c′n2−2dn+cn=c′n2−(2d−c)n= 4\left[\frac{c'n^2}{4} - \frac{dn}{2}\right] + cn = c'n^2 - 2dn + cn = c'n^2 - (2d - c)n=4[4cn22dn]+cn=cn22dn+cn=cn2(2dc)n

2d−c≥d2d - c \geq d2dcd,即 d≥cd \geq cdc 时,T(n)≤c′n2−dnT(n) \leq c'n^2 - dnT(n)cn2dn

下界验证

类似可证 T(n)=Ω(n2)T(n) = \Omega(n^2)T(n)=Ω(n2),因此 T(n)=Θ(n2)T(n) = \Theta(n^2)T(n)=Θ(n2)


Exercise 4.4-8

题目:对递归式 T(n)=T(n−a)+T(a)+cnT(n) = T(n-a) + T(a) + cnT(n)=T(na)+T(a)+cn,利用递归树给出一个渐近紧确解,其中 a≥1a \geq 1a1c>0c > 0c>0 是常数。

递归树分析

这是一个线性递归,递归树结构:

  • 第 0 层T(a)+cnT(a) + cnT(a)+cn
  • 第 1 层T(a)+c(n−a)T(a) + c(n-a)T(a)+c(na)
  • 第 2 层T(a)+c(n−2a)T(a) + c(n-2a)T(a)+c(n2a)
  • ⌊n/a⌋\lfloor n/a \rfloorn/aT(a)T(a)T(a)

总共有 ⌈n/a⌉\lceil n/a \rceiln/a 层。

总代价计算

T(n)=∑i=0⌈n/a⌉−1[T(a)+c(n−ia)]T(n) = \sum_{i=0}^{\lceil n/a \rceil -1} [T(a) + c(n - ia)]T(n)=i=0n/a1[T(a)+c(nia)]

=⌈n/a⌉⋅T(a)+c∑i=0⌈n/a⌉−1(n−ia)= \lceil n/a \rceil \cdot T(a) + c \sum_{i=0}^{\lceil n/a \rceil -1} (n - ia)=n/aT(a)+ci=0n/a1(nia)

=⌈n/a⌉⋅T(a)+c[⌈n/a⌉⋅n−a∑i=0⌈n/a⌉−1i]= \lceil n/a \rceil \cdot T(a) + c\left[\lceil n/a \rceil \cdot n - a \sum_{i=0}^{\lceil n/a \rceil -1} i\right]=n/aT(a)+cn/anai=0n/a1i

使用求和公式 ∑i=0k−1i=(k−1)k2\sum_{i=0}^{k-1} i = \frac{(k-1)k}{2}i=0k1i=2(k1)k

[!TIP]

  • 首项 a1=0a_1 = 0a1=0
  • 公差 d=1d = 1d=1
  • 项数 n=kn = kn=k
  • 使用 Sn=n(a1+an)2S_n = \frac{n(a_1 + a_n)}{2}Sn=2n(a1+an)

=⌈n/a⌉⋅T(a)+c[⌈n/a⌉⋅n−a⋅(⌈n/a⌉−1)⌈n/a⌉2]= \lceil n/a \rceil \cdot T(a) + c\left[\lceil n/a \rceil \cdot n - a \cdot \frac{(\lceil n/a \rceil - 1) \lceil n/a \rceil}{2}\right]=n/aT(a)+c[n/ana2(⌈n/a1)n/a]

nnn 能被 aaa 整除时,设 k=n/ak = n/ak=n/a

=k⋅T(a)+c[kn−ak(k−1)2]= k \cdot T(a) + c\left[kn - \frac{ak(k-1)}{2}\right]=kT(a)+c[kn2ak(k1)]

=na⋅T(a)+c[n2a−a⋅na⋅(na−1)2]= \frac{n}{a} \cdot T(a) + c\left[\frac{n^2}{a} - \frac{a \cdot \frac{n}{a} \cdot (\frac{n}{a}-1)}{2}\right]=anT(a)+c[an22aan(an1)]

=n⋅T(a)a+c[n2a−n(n−a)2a]= \frac{n \cdot T(a)}{a} + c\left[\frac{n^2}{a} - \frac{n(n-a)}{2a}\right]=anT(a)+c[an22an(na)]

=n⋅T(a)a+cn2a−cn(n−a)2a= \frac{n \cdot T(a)}{a} + \frac{cn^2}{a} - \frac{cn(n-a)}{2a}=anT(a)+acn22acn(na)

=n⋅T(a)a+cn2a−cn22a+cn2= \frac{n \cdot T(a)}{a} + \frac{cn^2}{a} - \frac{cn^2}{2a} + \frac{cn}{2}=anT(a)+acn22acn2+2cn

=n⋅T(a)a+cn22a+cn2= \frac{n \cdot T(a)}{a} + \frac{cn^2}{2a} + \frac{cn}{2}=anT(a)+2acn2+2cn

=c2an2+(T(a)a+c2)n=Θ(n2)= \frac{c}{2a}n^2 + \left(\frac{T(a)}{a} + \frac{c}{2}\right)n = \Theta(n^2)=2acn2+(aT(a)+2c)n=Θ(n2)


Exercise 4.4-9

题目:对递归式 T(n)=T(αn)+T((1−α)n)+cnT(n) = T(\alpha n) + T((1-\alpha)n) + cnT(n)=T(αn)+T((1α)n)+cn,利用递归树给出一个渐近紧确解,其中 0<α<10 < \alpha < 10<α<1c>0c > 0c>0 是常数。

递归树分析

由于两个子问题的大小之和为 αn+(1−α)n=n\alpha n + (1-\alpha)n = nαn+(1α)n=n,类似于归并排序,每层的总工作量都是 cncncn

树的深度由较大的子问题决定:

  • 如果 α≤1/2\alpha \leq 1/2α1/2,较大子问题是 T((1−α)n)T((1-\alpha)n)T((1α)n),深度约为 log⁡1/(1−α)n\log_{1/(1-\alpha)} nlog1/(1α)n
  • 如果 α>1/2\alpha > 1/2α>1/2,较大子问题是 T(αn)T(\alpha n)T(αn),深度约为 log⁡1/αn\log_{1/\alpha} nlog1/αn

总的来说,深度为 O(lg⁡n)O(\lg n)O(lgn)

上界验证

T(n)≤c′nlg⁡nT(n) \leq c' n \lg nT(n)cnlgn

T(n)=T(αn)+T((1−α)n)+cnT(n) = T(\alpha n) + T((1-\alpha)n) + cnT(n)=T(αn)+T((1α)n)+cn

≤c′αnlg⁡(αn)+c′(1−α)nlg⁡((1−α)n)+cn\leq c' \alpha n \lg(\alpha n) + c'(1-\alpha)n \lg((1-\alpha)n) + cncαnlg(αn)+c(1α)nlg((1α)n)+cn

=c′αn[lg⁡α+lg⁡n]+c′(1−α)n[lg⁡(1−α)+lg⁡n]+cn= c' \alpha n[\lg \alpha + \lg n] + c'(1-\alpha)n[\lg(1-\alpha) + \lg n] + cn=cαn[lgα+lgn]+c(1α)n[lg(1α)+lgn]+cn

=c′nlg⁡n[α+(1−α)]+c′n[αlg⁡α+(1−α)lg⁡(1−α)]+cn= c'n\lg n[\alpha + (1-\alpha)] + c'n[\alpha \lg \alpha + (1-\alpha)\lg(1-\alpha)] + cn=cnlgn[α+(1α)]+cn[αlgα+(1α)lg(1α)]+cn

=c′nlg⁡n+c′n[αlg⁡α+(1−α)lg⁡(1−α)]+cn= c'n\lg n + c'n[\alpha \lg \alpha + (1-\alpha)\lg(1-\alpha)] + cn=cnlgn+cn[αlgα+(1α)lg(1α)]+cn

关键不等式:对于 0<α<10 < \alpha < 10<α<1,有 αlg⁡α+(1−α)lg⁡(1−α)<0\alpha \lg \alpha + (1-\alpha)\lg(1-\alpha) < 0αlgα+(1α)lg(1α)<0

存在常数 δ>0\delta > 0δ>0 使得:αlg⁡α+(1−α)lg⁡(1−α)≤−δ\alpha \lg \alpha + (1-\alpha)\lg(1-\alpha) \leq -\deltaαlgα+(1α)lg(1α)δ

因此
T(n)≤c′nlg⁡n−c′δn+cn≤c′nlg⁡nT(n) \leq c'n\lg n - c'\delta n + cn \leq c'n\lg nT(n)cnlgncδn+cncnlgn

c′≥c/δc' \geq c/\deltacc/δ 时成立,所以 T(n)=O(nlg⁡n)T(n) = O(n \lg n)T(n)=O(nlgn)

下界验证

T(n)≥c′′nlg⁡nT(n) \geq c'' n \lg nT(n)c′′nlgn,其中 c′′>0c'' > 0c′′>0

T(n)=T(αn)+T((1−α)n)+cnT(n) = T(\alpha n) + T((1-\alpha)n) + cnT(n)=T(αn)+T((1α)n)+cn

≥c′′αnlg⁡(αn)+c′′(1−α)nlg⁡((1−α)n)+cn\geq c'' \alpha n \lg(\alpha n) + c''(1-\alpha)n \lg((1-\alpha)n) + cnc′′αnlg(αn)+c′′(1α)nlg((1α)n)+cn

=c′′αn[lg⁡α+lg⁡n]+c′′(1−α)n[lg⁡(1−α)+lg⁡n]+cn= c'' \alpha n[\lg \alpha + \lg n] + c''(1-\alpha)n[\lg(1-\alpha) + \lg n] + cn=c′′αn[lgα+lgn]+c′′(1α)n[lg(1α)+lgn]+cn

=c′′nlg⁡n+c′′n[αlg⁡α+(1−α)lg⁡(1−α)]+cn= c''n\lg n + c''n[\alpha \lg \alpha + (1-\alpha)\lg(1-\alpha)] + cn=c′′nlgn+c′′n[αlgα+(1α)lg(1α)]+cn

由于 αlg⁡α+(1−α)lg⁡(1−α)≤−δ<0\alpha \lg \alpha + (1-\alpha)\lg(1-\alpha) \leq -\delta < 0αlgα+(1α)lg(1α)δ<0

T(n)≥c′′nlg⁡n−c′′δn+cnT(n) \geq c''n\lg n - c''\delta n + cnT(n)c′′nlgnc′′δn+cn

c′′≤c/δc'' \leq c/\deltac′′c/δ 时,有 −c′′δn+cn≥0-c''\delta n + cn \geq 0c′′δn+cn0,因此:
T(n)≥c′′nlg⁡nT(n) \geq c''n\lg nT(n)c′′nlgn

这证明了 T(n)=Ω(nlg⁡n)T(n) = \Omega(n \lg n)T(n)=Ω(nlgn)

结论

结合上界和下界,得到 T(n)=Θ(nlg⁡n)T(n) = \Theta(n \lg n)T(n)=Θ(nlgn)

4.5 用主方法求解递归式

1. 基础理论

1.1 适用形式

主方法适用于形如以下的递归式: T(n)=aT(n/b)+f(n)T(n) = aT(n/b) + f(n)T(n)=aT(n/b)+f(n)

其中:

  • a≥1a \geq 1a1:子问题的个数
  • b>1b > 1b>1:每个子问题的规模是原问题的 1/b1/b1/b
  • f(n)f(n)f(n):在当前层进行的工作量(除递归调用外的时间)
1.2 关键参数

临界指数ncrit=log⁡ban_{\text{crit}} = \log_b ancrit=logba

这个指数决定了递归部分的增长速度:

  • 递归部分的复杂度为 Θ(nlog⁡ba)\Theta(n^{\log_b a})Θ(nlogba)
  • f(n)f(n)f(n) 与这个临界复杂度的比较决定了总体复杂度

2. 三种情况

2.1 递归主导

条件f(n)=O(nlog⁡ba−ε)f(n) = O(n^{\log_b a - \varepsilon})f(n)=O(nlogbaε),其中 ε>0\varepsilon > 0ε>0 是常数

T(n)=Θ(nlog⁡ba)T(n) = \Theta(n^{\log_b a})T(n)=Θ(nlogba)

直观理解:工作项 f(n)f(n)f(n) 增长比递归部分慢,递归部分主导总复杂度

  • T(n)=8T(n/2)+n2T(n) = 8T(n/2) + n^2T(n)=8T(n/2)+n2
    • a=8,b=2,f(n)=n2a = 8, b = 2, f(n) = n^2a=8,b=2,f(n)=n2
    • log⁡ba=log⁡28=3\log_b a = \log_2 8 = 3logba=log28=3
    • f(n)=n2=O(n3−ε)f(n) = n^2 = O(n^{3-\varepsilon})f(n)=n2=O(n3ε)(取 ε=1\varepsilon = 1ε=1
    • T(n)=Θ(n3)T(n) = \Theta(n^3)T(n)=Θ(n3)
2.2 平衡情况

条件f(n)=Θ(nlog⁡ba)f(n) = \Theta(n^{\log_b a})f(n)=Θ(nlogba)

T(n)=Θ(nlog⁡balog⁡n)T(n) = \Theta(n^{\log_b a} \log n)T(n)=Θ(nlogbalogn)

直观理解:工作项与递归部分同阶,总复杂度需要额外的对数因子

  • T(n)=2T(n/2)+nT(n) = 2T(n/2) + nT(n)=2T(n/2)+n
    • a=2,b=2,f(n)=na = 2, b = 2, f(n) = na=2,b=2,f(n)=n
    • log⁡ba=log⁡22=1\log_b a = \log_2 2 = 1logba=log22=1
    • f(n)=n=Θ(n1)f(n) = n = \Theta(n^1)f(n)=n=Θ(n1)
    • T(n)=Θ(nlog⁡n)T(n) = \Theta(n \log n)T(n)=Θ(nlogn)
2.3 工作项主导

条件f(n)=Ω(nlog⁡ba+ε)f(n) = \Omega(n^{\log_b a + \varepsilon})f(n)=Ω(nlogba+ε),其中 ε>0\varepsilon > 0ε>0,且存在常数 c<1c < 1c<1 使得对足够大的 nnn 有: af(n/b)≤cf(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))

直观理解:工作项增长比递归部分快,工作项主导总复杂度

正则性条件

额外条件 af(n/b)≤cf(n)af(n/b) \leq cf(n)af(n/b)cf(n) 称为正则性条件,确保工作项在各层之间以几何级数递减。

  • T(n)=2T(n/2)+n2T(n) = 2T(n/2) + n^2T(n)=2T(n/2)+n2
    • a=2,b=2,f(n)=n2a = 2, b = 2, f(n) = n^2a=2,b=2,f(n)=n2
    • log⁡ba=log⁡22=1\log_b a = \log_2 2 = 1logba=log22=1
    • f(n)=n2=Ω(n1+ε)f(n) = n^2 = \Omega(n^{1+\varepsilon})f(n)=n2=Ω(n1+ε)(取 ε=1\varepsilon = 1ε=1
    • 检查正则性:af(n/b)=2(n/2)2=n2/2≤cn2af(n/b) = 2(n/2)^2 = n^2/2 \leq cn^2af(n/b)=2(n/2)2=n2/2cn2(取 c=1/2c = 1/2c=1/2
    • T(n)=Θ(n2)T(n) = \Theta(n^2)T(n)=Θ(n2)

3. 特殊情况和间隙问题

特殊情况

快速排序(最坏情况)

递归式T(n)=T(n−1)+nT(n) = T(n-1) + nT(n)=T(n1)+n

注意:这不是主方法的标准形式!主方法不适用。

间隙问题

递归式T(n)=4T(n/2)+n2log⁡nT(n) = 4T(n/2) + n^2 \log nT(n)=4T(n/2)+n2logn

分析

  • a=4,b=2,f(n)=n2log⁡na = 4, b = 2, f(n) = n^2 \log na=4,b=2,f(n)=n2logn
  • log⁡ba=log⁡24=2\log_b a = \log_2 4 = 2logba=log24=2
  • f(n)=n2log⁡nf(n) = n^2 \log nf(n)=n2logn,这比 n2n^2n2 大但比 n2+εn^{2+\varepsilon}n2+ε 小(对数函数的政治上)
  • 经典主方法无法直接应用

f(n)=n2log⁡nf(n) = n^2 \log nf(n)=n2logn 落在了主方法的间隙中:

  • 它比 n2n^2n2 大(超出情况2)
  • 但比 n2+εn^{2+\varepsilon}n2+ε 小(不足情况3)
  • 也比 n2−εn^{2-\varepsilon}n2ε 大(超出情况1)

对数函数 log⁡n\log nlogn 具有特殊的增长性质:

  • 比任何正次幂慢:log⁡n=o(nε)\log n = o(n^{\varepsilon})logn=o(nε) 对任何 ε>0\varepsilon > 0ε>0
  • 但比常数快:log⁡n→∞\log n \to \inftylognn→∞n \to \inftyn

注意:这种情况需要扩展的主方法或其他技术来处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值