4.4 递归树
一、 对于幂函数的复习
证明:3log4n=nlog433^{\log_4 n} = n^{\log_4 3}3log4n=nlog43
方法一:标准推导
3log4n=3lnnln4(换底公式:log4n=lnnln4)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)
=(31ln4)lnn(幂的乘方法则: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)
=(eln3ln4)lnn(因为31ln4=eln3ln4)= \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)
=eln3ln4⋅lnn(幂的乘方法则:(ak)m=akm)= e^{\frac{\ln 3}{\ln 4} \cdot \ln n} \quad \text{(幂的乘方法则:} (a^k)^m = a^{km} \text{)}=eln4ln3⋅lnn(幂的乘方法则:(ak)m=akm)
=elnn⋅ln3ln4(乘法交换律)= e^{\ln n \cdot \frac{\ln 3}{\ln 4}} \quad \text{(乘法交换律)}=elnn⋅ln4ln3(乘法交换律)
=(elnn)ln3ln4(幂的乘方法则: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)
=nln3ln4(指数还原:elnn=n)= n^{\frac{\ln 3}{\ln 4}} \quad \text{(指数还原:} e^{\ln n} = n \text{)}=nln4ln3(指数还原:elnn=n)
=nlog43(换底公式:ln3ln4=log43)= n^{\log_4 3} \quad \text{(换底公式:} \frac{\ln 3}{\ln 4} = \log_4 3 \text{)}=nlog43(换底公式:ln4ln3=log43)
方法二:对数验证法
设 x=3log4nx = 3^{\log_4 n}x=3log4n,两边取以4为底的对数:
log4x=log4(3log4n)=(log4n)⋅(log43)(对数的幂法则)\log_4 x = \log_4(3^{\log_4 n}) = (\log_4 n) \cdot (\log_4 3) \quad \text{(对数的幂法则)}log4x=log4(3log4n)=(log4n)⋅(log43)(对数的幂法则)
=(log43)⋅(log4n)(乘法交换律)= (\log_4 3) \cdot (\log_4 n) \quad \text{(乘法交换律)}=(log43)⋅(log4n)(乘法交换律)
设 y=nlog43y = n^{\log_4 3}y=nlog43,两边取以4为底的对数:
log4y=log4(nlog43)=(log43)⋅(log4n)(对数的幂法则)\log_4 y = \log_4(n^{\log_4 3}) = (\log_4 3) \cdot (\log_4 n) \quad \text{(对数的幂法则)}log4y=log4(nlog43)=(log43)⋅(log4n)(对数的幂法则)
因为 log4x=log4y\log_4 x = \log_4 ylog4x=log4y,所以 x=yx = yx=y,即:3log4n=nlog433^{\log_4 n} = n^{\log_4 3}3log4n=nlog43
幂对换公式的一般形式
alogbn=nlogba(条件: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]
常用公式回顾
logab=logbloga=lnblna(换底公式)\log_a b = \frac{\log b}{\log a} = \frac{\ln b}{\ln a} \quad \text{(换底公式)}logab=logalogb=lnalnb(换底公式)
logab⋅logbc=logac(对数的连乘)\log_a b \cdot \log_b c = \log_a c \quad \text{(对数的连乘)}logab⋅logbc=logac(对数的连乘)
alogbc=clogba(幂对换公式)a^{\log_b c} = c^{\log_b a} \quad \text{(幂对换公式)}alogbc=clogba(幂对换公式)
loga(bc)=c⋅logab(对数的幂法则)\log_a(b^c) = c \cdot \log_a b \quad \text{(对数的幂法则)}loga(bc)=c⋅logab(对数的幂法则)
ak⋅m=(ak)m(幂的乘方法则)a^{k \cdot m} = (a^k)^m \quad \text{(幂的乘方法则)}ak⋅m=(ak)m(幂的乘方法则)
二、数列求和相关
T(n)=cn2+316cn2+(316)2cn2+⋯+(316)log4n−1cn2+Θ(nlog43)
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)log4n−1cn2+Θ(nlog43)
=∑i=0log4n−1(316)icn2+Θ(nlog43)/* 写成等比数列求和的形式 */ = \sum_{i=0}^{{\log_4 n}-1} \left(\frac{3}{16}\right)^i c n^2 + \Theta(n^{\log_4 3}) \qquad \text{/* 写成等比数列求和的形式 */} =i=0∑log4n−1(163)icn2+Θ(nlog43)/* 写成等比数列求和的形式 */
<∑i=0∞(316)icn2+Θ(nlog43)/* 用无穷级数和估计有限级数和,上界分析 */ < \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+Θ(nlog43),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=0∑∞qi)cn2+Θ(nlog43),q=163/* 设q=163,便于套用公式 */
=11−qcn2+Θ(nlog43)/* 等比无穷级数求和公式:∑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$ */} =1−q1cn2+Θ(nlog43)/* 等比无穷级数求和公式:∑i=0∞qi=1−q1,∣q∣<1 */
=1613cn2+Θ(nlog43)/* 代入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的值,1−q=1−163=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=0∑kqi=1−q1−qk+1无穷等比数列求和公式
无穷等比数列指的是首项为 aaa,公比为 qqq,项数无限的数列:
a, aq, aq2, aq3, … a, \; aq, \; aq^2, \; aq^3, \; \ldots a,aq,aq2,aq3,…若 ∣q∣<1|q| < 1∣q∣<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=0∑∞aqi=1−qa其中:
- aaa 为首项
- qqq 为公比(∣q∣<1|q|<1∣q∣<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} S−qS=aS(1−q)=aS=1−qa
注意:
- 只有当 ∣q∣<1|q|<1∣q∣<1 时,级数才收敛,有和公式。
- 若 ∣q∣≥1|q|\geq 1∣q∣≥1,级数发散,无和。
设无穷等比级数的部分和为 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=a⋅1−q1−qn+1(q≠1q \neq 1q=1)
当 ∣q∣<1|q|<1∣q∣<1,qn+1→0q^{n+1} \to 0qn+1→0,所以 limn→∞Sn=a1−q\displaystyle \lim_{n\to\infty} S_n = \frac{a}{1-q}n→∞limSn=1−qa,极限存在,级数收敛。
当 ∣q∣>1|q|>1∣q∣>1,∣qn+1∣→∞|q^{n+1}| \to \infty∣qn+1∣→∞,SnS_nSn 不存在有限极限,级数发散。
当 q=1q=1q=1,Sn=a(n+1)→∞S_n = a(n+1) \to \inftySn=a(n+1)→∞,级数发散。
当 q=−1q=-1q=−1,SnS_nSn 在 aaa 和 000 之间振荡,无极限,级数发散。
因此,只有 ∣q∣<1|q|<1∣q∣<1 时无穷等比级数收敛,其余情况均发散。
对于无穷级数 ∑n=0∞an\sum_{n=0}^\infty a_n∑n=0∞an,我们考察它的部分和 SN=∑n=0NanS_N = \sum_{n=0}^N a_nSN=∑n=0Nan。
- 如果 limN→∞SN\displaystyle \lim_{N\to\infty} S_NN→∞limSN 存在且为有限实数(不是无穷大,也不是震荡),则称级数收敛。
- 如果极限不存在,或者极限为无穷大或无界,或者部分和在多个值之间震荡,则称级数发散。
因此,极限存在且有限 ⟺ \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=0∑naqi=a⋅1−q1−qn+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+⋯+arn−1
其中:
- 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=0∑n−1ari=a+ar+ar2+⋯+arn−1
求和公式
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=0∑n−1ari=a⋅1−r1−rn=a⋅r−1rn−1
推导过程: 设 S=a+ar+ar2+⋯+arn−1S = a + ar + ar^2 + \cdots + ar^{n-1}S=a+ar+ar2+⋯+arn−1
两边同时乘以 rrr: rS=ar+ar2+ar3+⋯+arnrS = ar + ar^2 + ar^3 + \cdots + ar^nrS=ar+ar2+ar3+⋯+arn
两式相减: S−rS=a−arnS - rS = a - ar^nS−rS=a−arn (1−r)S=a(1−rn)(1-r)S = a(1-r^n)(1−r)S=a(1−rn) S=a⋅1−rn1−rS = a \cdot \frac{1-r^n}{1-r}S=a⋅1−r1−rn
无穷几何级数
当 ∣r∣<1|r| < 1∣r∣<1 时,无穷级数收敛: ∑i=0∞ari=a1−r\sum_{i=0}^{\infty} ar^i = \frac{a}{1-r}i=0∑∞ari=1−ra
从第1项开始的级数
∑i=1nari=ar⋅1−rn1−r\sum_{i=1}^{n} ar^i = ar \cdot \frac{1-r^n}{1-r}i=1∑nari=ar⋅1−r1−rn
方法一:提取公因子
∑i=1nari=ar+ar2+ar3+⋯+arn\sum_{i=1}^{n} ar^i = ar + ar^2 + ar^3 + \cdots + ar^ni=1∑nari=ar+ar2+ar3+⋯+arn提取 ararar:
=ar(1+r+r2+⋯+rn−1)= ar(1 + r + r^2 + \cdots + r^{n-1})=ar(1+r+r2+⋯+rn−1)
=ar∑i=0n−1ri= ar \sum_{i=0}^{n-1} r^i=ari=0∑n−1ri应用基础公式(a=1a=1a=1):
=ar⋅1−rn1−r= ar \cdot \frac{1-r^n}{1-r}=ar⋅1−r1−rn方法二:利用级数分割
∑i=1nari=∑i=0nari−∑i=00ari\sum_{i=1}^{n} ar^i = \sum_{i=0}^{n} ar^i - \sum_{i=0}^{0} ar^ii=1∑nari=i=0∑nari−i=0∑0ari
=∑i=0nari−a= \sum_{i=0}^{n} ar^i - a=i=0∑nari−a
=a⋅1−rn+11−r−a= a \cdot \frac{1-r^{n+1}}{1-r} - a=a⋅1−r1−rn+1−a
=a(1−rn+11−r−1)= a\left(\frac{1-r^{n+1}}{1-r} - 1\right)=a(1−r1−rn+1−1)
=a(1−rn+1−(1−r)1−r)= a\left(\frac{1-r^{n+1} - (1-r)}{1-r}\right)=a(1−r1−rn+1−(1−r))
=a(1−rn+1−1+r1−r)= a\left(\frac{1-r^{n+1} - 1 + r}{1-r}\right)=a(1−r1−rn+1−1+r)
=a(r−rn+11−r)= a\left(\frac{r - r^{n+1}}{1-r}\right)=a(1−rr−rn+1)
=a(r(1−rn)1−r)= a\left(\frac{r(1 - r^n)}{1-r}\right)=a(1−rr(1−rn))
=ar⋅1−rn1−r= ar \cdot \frac{1-r^n}{1-r}=ar⋅1−r1−rn
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,因此深度为 lgn\lg nlgn(lg是以2为底)
[!NOTE]
当达到基础情况时,问题规模为 1, 也就是n2k=1\frac{n}{2^k} = 12kn=1
解这个方程: 2k=n2^k = n2k=n k=log2n=lgnk = \log_2 n = \lg nk=log2n=lgn 因此,递归树的深度确实是 lgn\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=0lgnn⋅(32)i=n∑i=0lgn(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=0∑lgnn⋅(23)i=ni=0∑lgn(23)i
使用几何级数公式 ∑i=0kri=rk+1−1r−1\sum_{i=0}^{k} r^i = \frac{r^{k+1} - 1}{r - 1}∑i=0kri=r−1rk+1−1:
=n⋅(3/2)lgn+1−13/2−1=2n[(3/2)lgn+1−1]= n \cdot \frac{(3/2)^{\lg n + 1} - 1}{3/2 - 1} = 2n[(3/2)^{\lg n + 1} - 1]=n⋅3/2−1(3/2)lgn+1−1=2n[(3/2)lgn+1−1]
关键计算:(3/2)lgn(3/2)^{\lg n}(3/2)lgn 的值
使用换底公式和幂对换公式 alogbc=clogbaa^{\log_b c} = c^{\log_b a}alogbc=clogba:
(3/2)lgn=(3/2)log2n=nlog2(3/2)=nlg3−lg2=nlg3−1=nlg3n(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)=nlg3−lg2=nlg3−1=nnlg3
因此:
(3/2)lgn+1=32⋅nlg3n=3nlg32n(3/2)^{\lg n + 1} = \frac{3}{2} \cdot \frac{n^{\lg 3}}{n} = \frac{3n^{\lg 3}}{2n}(3/2)lgn+1=23⋅nnlg3=2n3nlg3
主导项分析:
T(n)=2n[3nlg32n−1]=3nlg3−2nT(n) = 2n\left[\frac{3n^{\lg 3}}{2n} - 1\right] = 3n^{\lg 3} - 2nT(n)=2n[2n3nlg3−1]=3nlg3−2n
主导项为:T(n)=Θ(nlg3)T(n) = \Theta(n^{\lg 3})T(n)=Θ(nlg3),其中 lg3≈1.585\lg 3 \approx 1.585lg3≈1.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)≤cnk−dnk−1
应用场景
递归式形如 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)≤cn2−dn 可以用 −dn-dn−dn 抵消 +n+n+n
代入法验证
设 T(n)≤cnlg3−dnT(n) \leq c n^{\lg 3} - d nT(n)≤cnlg3−dn,其中 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⌋)lg3−d⌊n/2⌋]+n\leq 3[c(\lfloor n/2 \rfloor)^{\lg 3} - d \lfloor n/2 \rfloor] + n≤3[c(⌊n/2⌋)lg3−d⌊n/2⌋]+n
处理取整项:由于 ⌊n/2⌋≤n/2\lfloor n/2 \rfloor \leq n/2⌊n/2⌋≤n/2,有 (⌊n/2⌋)lg3≤(n/2)lg3(\lfloor n/2 \rfloor)^{\lg 3} \leq (n/2)^{\lg 3}(⌊n/2⌋)lg3≤(n/2)lg3:
≤3[c⋅nlg32lg3−d⌊n/2⌋]+n\leq 3\left[c \cdot \frac{n^{\lg 3}}{2^{\lg 3}} - d \lfloor n/2 \rfloor\right] + n≤3[c⋅2lg3nlg3−d⌊n/2⌋]+n
由于 2lg3=32^{\lg 3} = 32lg3=3:
=3[c⋅nlg33−d⌊n/2⌋]+n=cnlg3−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[c⋅3nlg3−d⌊n/2⌋]+n=cnlg3−3d⌊n/2⌋+n
进一步估算:当 nnn 足够大时,⌊n/2⌋≥n/2−1\lfloor n/2 \rfloor \geq n/2 - 1⌊n/2⌋≥n/2−1,所以:
−3d⌊n/2⌋≤−3d(n/2−1)=−3dn2+3d-3d \lfloor n/2 \rfloor \leq -3d(n/2 - 1) = -\frac{3dn}{2} + 3d−3d⌊n/2⌋≤−3d(n/2−1)=−23dn+3d
因此:
T(n)≤cnlg3−3dn2+3d+n=cnlg3+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)≤cnlg3−23dn+3d+n=cnlg3+n(1−23d)+3d
设置约束:要使 T(n)≤cnlg3−dnT(n) \leq c n^{\lg 3} - d nT(n)≤cnlg3−dn,当 nnn 足够大时(常数项可忽略),需要:
1−3d2≤−d1 - \frac{3d}{2} \leq -d1−23d≤−d
1≤3d2−d=d21 \leq \frac{3d}{2} - d = \frac{d}{2}1≤23d−d=2d
d≥2d \geq 2d≥2
当 d≥2d \geq 2d≥2 时成立,因此 T(n)=O(nlg3)T(n) = O(n^{\lg 3})T(n)=O(nlg3)。
[!NOTE]
x−1<⌊x⌋≤xx - 1 < \lfloor x \rfloor \leq xx−1<⌊x⌋≤x
Exercise 4.4-2
题目:对递归式 T(n)=T(n/2)+n2T(n) = T(n/2) + n^2T(n)=T(n/2)+n2,利用递归树确定一个好的渐近上界,用代入法进行验证。
递归树分析
递归树的结构:
- 树的深度:lgn\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=0lgnn24i=n2∑i=0lgn(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=0∑lgn4in2=n2i=0∑lgn(41)i
使用几何级数公式:
=n2⋅1−(1/4)lgn+11−1/4=n2⋅1−(1/4)lgn+13/4=4n23[1−(1/4)lgn+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}]=n2⋅1−1/41−(1/4)lgn+1=n2⋅3/41−(1/4)lgn+1=34n2[1−(1/4)lgn+1]
关键计算:(1/4)lgn+1(1/4)^{\lg n + 1}(1/4)lgn+1 的值
使用换底公式:
(1/4)lgn=(1/4)log2n=nlog2(1/4)=nlog2(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(2−2)=n−2=n21
因此:
(1/4)lgn+1=14⋅(1/4)lgn=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=41⋅n21=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[1−4n21]=34n2−31
主导项为:T(n)=4n23−13=O(n2)T(n) = \frac{4n^2}{3} - \frac{1}{3} = O(n^2)T(n)=34n2−31=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)+n2≤c(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+1≤c
1≤c−c4=3c41 \leq c - \frac{c}{4} = \frac{3c}{4}1≤c−4c=43c
43≤c\frac{4}{3} \leq c34≤c
当 c≥4/3c \geq 4/3c≥4/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,利用递归树确定一个好的渐近上界,用代入法进行验证。
递归树分析
递归树的结构:
- 树的深度:约为 lgn\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=n⋅2i
总代价计算
T(n)≈∑i=0lgnn⋅2i=n∑i=0lgn2i=n(2lgn+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=0∑lgnn⋅2i=ni=0∑lgn2i=n(2lgn+1−1)=n(2n−1)=O(n2)
代入法验证
设 T(n)≤cn2−dnT(n) \leq c n^2 - d nT(n)≤cn2−dn,其中 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[cm2−dm]+n=4c(n/2+2)2−4d(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+16c−2dn−8d+n
=cn2+n(8c−2d+1)+(16c−8d)= c n^2 + n(8c - 2d + 1) + (16c - 8d)=cn2+n(8c−2d+1)+(16c−8d)
要使 T(n)≤cn2−dnT(n) \leq c n^2 - d nT(n)≤cn2−dn,需要:
n(8c−2d+1)+(16c−8d)≤−dnn(8c - 2d + 1) + (16c - 8d) \leq -dnn(8c−2d+1)+(16c−8d)≤−dn
整理得:
n(8c−2d+1+d)+(16c−8d)≤0n(8c - 2d + 1 + d) + (16c - 8d) \leq 0n(8c−2d+1+d)+(16c−8d)≤0
n(8c−d+1)+(16c−8d)≤0n(8c - d + 1) + (16c - 8d) \leq 0n(8c−d+1)+(16c−8d)≤0
这要求:
- 线性项系数:8c−d+1≤08c - d + 1 \leq 08c−d+1≤0,即 d≥8c+1d \geq 8c + 1d≥8c+1
- 常数项:16c−8d≤016c - 8d \leq 016c−8d≤0,即 d≥2cd \geq 2cd≥2c
综合约束:d≥max(8c+1,2c)d \geq \max(8c + 1, 2c)d≥max(8c+1,2c)
当 c≥1/6c \geq 1/6c≥1/6 时,8c+1≥2c8c + 1 \geq 2c8c+1≥2c,所以需要 d≥8c+1d \geq 8c + 1d≥8c+1。
参数选择:取 c=1,d=9c = 1, d = 9c=1,d=9,满足 d=8c+1d = 8c + 1d=8c+1 和 d>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(n−1)+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=0∑n−12i⋅1=i=0∑n−12i=2n−1=O(2n)
代入法验证
设 T(n)≤2n−1T(n) \leq 2^n - 1T(n)≤2n−1:
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(n−1)+1≤2(2n−1−1)+1=2n−2+1=2n−1
假设成立,因此 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(n−1)+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(n−1)+T(n/2)+n≤2n−1+2n/2+n
问题:2n−1+2n/2+n2^{n-1} + 2^{n/2} + n2n−1+2n/2+n 不一定 ≤2n\leq 2^n≤2n,因为我们有额外的 2n/2+n2^{n/2} + n2n/2+n 项。
强化假设:设 T(n)≤2n−an−bT(n) \leq 2^n - an - bT(n)≤2n−an−b,其中 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(n−1)+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≤[2n−1−a(n−1)−b]+[2n/2−a(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=2n−1+2n/2−a(n−1)−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=2n−1+2n/2−an+a−2an−2b+n
=2n−1+2n/2−3an2+a−2b+n= 2^{n-1} + 2^{n/2} - \frac{3an}{2} + a - 2b + n=2n−1+2n/2−23an+a−2b+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)=2n−1+2n/2+n(1−23a)+(a−2b)
要使结果 ≤2n−an−b\leq 2^n - an - b≤2n−an−b,需要:
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 - b2n−1+2n/2+n(1−23a)+(a−2b)≤2n−an−b
分析约束条件:
-
指数项:当 nnn 足够大时,2n/2≪2n−12^{n/2} \ll 2^{n-1}2n/2≪2n−1,所以:
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}2n−1+2n/2≤2n−1+ε⋅2n−1=(1+ε)⋅2n−1其中 ε\varepsilonε 是任意小的正数。要使 (1+ε)⋅2n−1≤2n=2⋅2n−1(1+\varepsilon) \cdot 2^{n-1} \leq 2^n = 2 \cdot 2^{n-1}(1+ε)⋅2n−1≤2n=2⋅2n−1,需要 1+ε≤21+\varepsilon \leq 21+ε≤2,这在 nnn 足够大时成立。
-
线性项:需要 1−3a2≤−a1 - \frac{3a}{2} \leq -a1−23a≤−a,即:
1≤3a2−a=a21 \leq \frac{3a}{2} - a = \frac{a}{2}1≤23a−a=2a
a≥2a \geq 2a≥2 -
常数项:需要 a−2b≤−ba - 2b \leq -ba−2b≤−b,即:
a≤ba \leq ba≤b
参数选择:取 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(n−1)k+c(n/2)k+n
当 nnn 足够大时,(n−1)k≈nk(n-1)^k \approx n^k(n−1)k≈nk:
≤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) + n≤cnk+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)≤2n−2n−2,并调整参数以确保基础情况成立。
因此 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,利用递归树论证其解为 Ω(nlgn)\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 1n→n/3→n/9→n/27→⋯→1
路径长度为 log3n\log_3 nlog3n,因此树的高度至少为 log3n\log_3 nlog3n。
总代价下界: T(n)≥cn⋅(log3n+1)≥cnlog3n=c⋅lnnln3⋅n=cln3nlnn=Ω(nlgn)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=c⋅ln3lnn⋅n=ln3cnlnn=Ω(nlgn)
Exercise 4.4-7
题目:对递归式 T(n)=4T(⌊n/2⌋)+cnT(n) = 4T(\lfloor n/2 \rfloor) + cnT(n)=4T(⌊n/2⌋)+cn(ccc 为常数),画出递归树,并给出其解的一个渐近紧确界。用代入法进行验证。
递归树分析
递归树的结构:
- 第 iii 层节点数:4i4^i4i
- 第 iii 层每个节点的代价:c⋅n/2ic \cdot n/2^ic⋅n/2i
- 第 iii 层总代价:4i⋅cn2i=cn⋅2i4^i \cdot \frac{cn}{2^i} = cn \cdot 2^i4i⋅2icn=cn⋅2i
- 树的深度:lgn\lg nlgn
总代价计算
T(n)=∑i=0lgncn⋅2i=cn∑i=0lgn2i=cn(2lgn+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=0∑lgncn⋅2i=cni=0∑lgn2i=cn(2lgn+1−1)=cn(2n−1)=O(n2)
上界验证
设 T(n)≤c′n2−dnT(n) \leq c' n^2 - d nT(n)≤c′n2−dn:
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⌋)+cn≤4[c′(2n)2−d(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[4c′n2−2dn]+cn=c′n2−2dn+cn=c′n2−(2d−c)n
当 2d−c≥d2d - c \geq d2d−c≥d,即 d≥cd \geq cd≥c 时,T(n)≤c′n2−dnT(n) \leq c'n^2 - dnT(n)≤c′n2−dn。
下界验证
类似可证 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(n−a)+T(a)+cn,利用递归树给出一个渐近紧确解,其中 a≥1a \geq 1a≥1 和 c>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(n−a)
- 第 2 层:T(a)+c(n−2a)T(a) + c(n-2a)T(a)+c(n−2a)
- 第 ⌊n/a⌋\lfloor n/a \rfloor⌊n/a⌋ 层:T(a)T(a)T(a)
总共有 ⌈n/a⌉\lceil n/a \rceil⌈n/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=0∑⌈n/a⌉−1[T(a)+c(n−ia)]
=⌈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/a⌉⋅T(a)+ci=0∑⌈n/a⌉−1(n−ia)
=⌈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/a⌉⋅T(a)+c⌈n/a⌉⋅n−ai=0∑⌈n/a⌉−1i
使用求和公式 ∑i=0k−1i=(k−1)k2\sum_{i=0}^{k-1} i = \frac{(k-1)k}{2}∑i=0k−1i=2(k−1)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/a⌉⋅T(a)+c[⌈n/a⌉⋅n−a⋅2(⌈n/a⌉−1)⌈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]=k⋅T(a)+c[kn−2ak(k−1)]
=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]=an⋅T(a)+c[an2−2a⋅an⋅(an−1)]
=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]=an⋅T(a)+c[an2−2an(n−a)]
=n⋅T(a)a+cn2a−cn(n−a)2a= \frac{n \cdot T(a)}{a} + \frac{cn^2}{a} - \frac{cn(n-a)}{2a}=an⋅T(a)+acn2−2acn(n−a)
=n⋅T(a)a+cn2a−cn22a+cn2= \frac{n \cdot T(a)}{a} + \frac{cn^2}{a} - \frac{cn^2}{2a} + \frac{cn}{2}=an⋅T(a)+acn2−2acn2+2cn
=n⋅T(a)a+cn22a+cn2= \frac{n \cdot T(a)}{a} + \frac{cn^2}{2a} + \frac{cn}{2}=an⋅T(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<α<1 和 c>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),深度约为 log1/(1−α)n\log_{1/(1-\alpha)} nlog1/(1−α)n
- 如果 α>1/2\alpha > 1/2α>1/2,较大子问题是 T(αn)T(\alpha n)T(αn),深度约为 log1/αn\log_{1/\alpha} nlog1/αn
总的来说,深度为 O(lgn)O(\lg n)O(lgn)。
上界验证
设 T(n)≤c′nlgnT(n) \leq c' n \lg nT(n)≤c′nlgn:
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) + cn≤c′αnlg(αn)+c′(1−α)nlg((1−α)n)+cn
=c′αn[lgα+lgn]+c′(1−α)n[lg(1−α)+lgn]+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′nlgn[α+(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=c′nlgn[α+(1−α)]+c′n[αlgα+(1−α)lg(1−α)]+cn
=c′nlgn+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
关键不等式:对于 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′nlgn−c′δn+cn≤c′nlgnT(n) \leq c'n\lg n - c'\delta n + cn \leq c'n\lg nT(n)≤c′nlgn−c′δn+cn≤c′nlgn
当 c′≥c/δc' \geq c/\deltac′≥c/δ 时成立,所以 T(n)=O(nlgn)T(n) = O(n \lg n)T(n)=O(nlgn)。
下界验证
设 T(n)≥c′′nlgnT(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) + cn≥c′′αnlg(αn)+c′′(1−α)nlg((1−α)n)+cn
=c′′αn[lgα+lgn]+c′′(1−α)n[lg(1−α)+lgn]+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′′nlgn+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′′nlgn−c′′δn+cnT(n) \geq c''n\lg n - c''\delta n + cnT(n)≥c′′nlgn−c′′δn+cn
当 c′′≤c/δc'' \leq c/\deltac′′≤c/δ 时,有 −c′′δn+cn≥0-c''\delta n + cn \geq 0−c′′δn+cn≥0,因此:
T(n)≥c′′nlgnT(n) \geq c''n\lg nT(n)≥c′′nlgn
这证明了 T(n)=Ω(nlgn)T(n) = \Omega(n \lg n)T(n)=Ω(nlgn)。
结论
结合上界和下界,得到 T(n)=Θ(nlgn)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 1a≥1:子问题的个数
- b>1b > 1b>1:每个子问题的规模是原问题的 1/b1/b1/b
- f(n)f(n)f(n):在当前层进行的工作量(除递归调用外的时间)
1.2 关键参数
临界指数:ncrit=logban_{\text{crit}} = \log_b ancrit=logba
这个指数决定了递归部分的增长速度:
- 递归部分的复杂度为 Θ(nlogba)\Theta(n^{\log_b a})Θ(nlogba)
- f(n)f(n)f(n) 与这个临界复杂度的比较决定了总体复杂度
2. 三种情况
2.1 递归主导
条件:f(n)=O(nlogba−ε)f(n) = O(n^{\log_b a - \varepsilon})f(n)=O(nlogba−ε),其中 ε>0\varepsilon > 0ε>0 是常数
解:T(n)=Θ(nlogba)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
- logba=log28=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)=Θ(nlogba)f(n) = \Theta(n^{\log_b a})f(n)=Θ(nlogba)
解:T(n)=Θ(nlogbalogn)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
- logba=log22=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)=Θ(nlogn)T(n) = \Theta(n \log n)T(n)=Θ(nlogn)
2.3 工作项主导
条件:f(n)=Ω(nlogba+ε)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
- logba=log22=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/2≤cn2(取 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(n−1)+n
注意:这不是主方法的标准形式!主方法不适用。
间隙问题
递归式:T(n)=4T(n/2)+n2lognT(n) = 4T(n/2) + n^2 \log nT(n)=4T(n/2)+n2logn
分析:
- a=4,b=2,f(n)=n2logna = 4, b = 2, f(n) = n^2 \log na=4,b=2,f(n)=n2logn
- logba=log24=2\log_b a = \log_2 4 = 2logba=log24=2
- f(n)=n2lognf(n) = n^2 \log nf(n)=n2logn,这比 n2n^2n2 大但比 n2+εn^{2+\varepsilon}n2+ε 小(对数函数的政治上)
- 经典主方法无法直接应用
f(n)=n2lognf(n) = n^2 \log nf(n)=n2logn 落在了主方法的间隙中:
- 它比 n2n^2n2 大(超出情况2)
- 但比 n2+εn^{2+\varepsilon}n2+ε 小(不足情况3)
- 也比 n2−εn^{2-\varepsilon}n2−ε 大(超出情况1)
对数函数 logn\log nlogn 具有特殊的增长性质:
- 比任何正次幂慢:logn=o(nε)\log n = o(n^{\varepsilon})logn=o(nε) 对任何 ε>0\varepsilon > 0ε>0
- 但比常数快:logn→∞\log n \to \inftylogn→∞ 当 n→∞n \to \inftyn→∞
注意:这种情况需要扩展的主方法或其他技术来处理