分治算法递归式
- 分解: 将问题分解为多个子问题
- 解决: 递归地求解每个子问题
- 合并: 将子问题的解合并为原问题的解
T(n)=\begin{cases}
\Theta(1) & n\leq c \\[0ex]
a_1T(n/b_1)+\cdots+a_kT(b_k)+f(n) & n>c
\end{cases}
递归式: 分别生成a_i个规模为n/b_i的子问题, 合并与分解需要f(n)
1-代入法
- 简化递归式: 进行合适的变量代换
- 猜测解的形式: 使用递归树预测, 逐步缩小解的范围
- 用数学归纳法证明: 可以适当添加低阶项进行放缩
示例1: T(n)=4(n/2)+n
猜测(1): T(n)=O(n^3)
假设: \forall t<n,T(t)\leq ct^3
证明: T(n)=4T(n/2)+n\leq 4c(n/2)^3+n=cn^3/2+n\leq cn^3
满足: n\geq\sqrt{2/c}
猜测(2): T(n)=O(n^2)
假设: \forall t<n,T(t)\leq ct^2+dt
证明: T(n)=4T(n/2)+n\leq 4c(n/2)^2+4d(n/2)+n=cn^2+(2d+1)n\leq cn^2+dn
满足: d\leq-1
猜测(3): T(n)=\Omega(n^2)
假设: \forall t<n,T(t)\geq ct^2
证明: T(n)=4T(n/2)+n\geq 4c(n/2)^2+n=cn^2+n\geq cn^2
综上所述: T(n)=\Theta(n^2)
示例2: T(n)=2T(\sqrt{n})+\lg n
变量代换: m=\lg n\iff 2^m=n
新递归式: T(2^m)=2T(2^{m/2})+m
变换形式: S(m)=2S(m/2)+m
得到结果: T(n)=S(m)=\Theta(m\lg m)=\Theta(\lg n\lg\lg n)
2-递归树法

递归式1: T(n)=3T(n/4)+\Theta(n^2)
\begin{aligned}
由递归树得\quad T(n)&=cn^2+(3/16)cn^2+\cdots+(3/16)^{\log_4n-1}cn^2+\Theta(n^{\log_43}) \\
&=cn^2\cdot\sum_{i=0}^{\log_4n-1}(3/16)^i+\Theta(n^{\log_43}) \\
&=cn^2\cdot\frac{1-(3/16)^{\log_4n}}{1-3/16}+\Theta(n^{\log_43})=O(n^2)
\end{aligned}
根节点复杂度为cn^2\implies T(n)=\Omega(n^2)\implies T(n)=\Theta(n^2)

递归式2: T(n)=T(n/3)+T(2n/3)+O(n)
每层代价: \leq cn
最短层数: \log_3n
最长层数: \log_{3/2}n
得到下界: \Omega(cn\cdot\log_3n)=\Omega(n\lg n)
猜测上界: O(cn\cdot\log_{3/2}n)=O(n\lg n)
代入法证明: 假设 \forall t<n,T(t)\leq dn\lg n
\begin{aligned}
T(n)&=T(n/3)+T(2n/3)+O(n) \\
&\leq T(n/3)+T(2n/3)+cn \\
&\leq d(n/3)\lg(n/3)+d(2n/3)\lg(2n/3)+cn \\
&=dn\lg n-dn(\lg3-2/3)+cn\leq dn\lg n
\end{aligned}
3-主定理
引理1: 用递归树化简递归式
引理1: 已知 a\geq1,b>1,f(n):\{b^i\}\mapsto\mathbb{R^+}
\begin{aligned}
T(n)&=\begin{cases}\Theta(1) & n=1 \\
aT(n/b)+f(n) & n=b^i \end{cases} \\
&=\sum_0^{\log_b n-1}a^if(n/b^i)+\Theta(n^{\log_b a})
\end{aligned}
证明: 自上而下 每层结点的质量呈几何衰减 数量几何增加
两者此消彼长, 将共同作用的效果逐层累加 得到最终结果
第\{0,1,\cdots,\log_b n-1\}层为枝结点层, 第\log_b n层为叶子层
逐层累加得 T(n)=\sum_0^{\log_b n-1}a^if(n/b^i)+\Theta(n^{\log_b a})

引理2: 幂次散点上的枝结点复杂度
引理2: 已知 a\geq1,b>1,f(n):\{b^i\}\mapsto\mathbb{R^+}
枝结点函数 g(n):\{b^i\}\mapsto\mathbb{R^+}:\sum_0^{\log_bn-1}a^if(n/b^i)
- 叶结点主导: f(n)=O(n^{\log_ba-\epsilon})\implies g(n)=O(n^{\log_ba})
- 各层均分布: f(n)=\Theta(n^{\log_ba})\implies g(n)=\Theta(n^{\log_ba}\lg n)
- 根结点主导: af(n/b)\leq cf(n)\implies g(n)=\Theta(f(n)):c<1
------
(1)叶结点主导: f(n)= O(n^{\log_ba-\epsilon})\implies g(n)=O(n^{\log_ba})
\begin{aligned}
g(n)&=\sum_0^{\log_bn-1}a^if(n/b^i)\leq\sum_0^{\log_b n-1}a^i(n/b^i)^{\log_b a-\epsilon} \\
&=n^{\log_ba-\epsilon}\sum_0^{\log_bn-1}a^ib^{-i\log_ba}b^{i\epsilon}=n^{\log_ba-\epsilon}\sum_0^{\log_bn-1}a^ia^{-i}b^{i\epsilon} \\
&=n^{\log_ba-\epsilon}\sum_0^{\log_bn-1}b^{i\epsilon}\quad(取决于最后几层) \\
&=n^{\log_ba-\epsilon}\frac{b^{\epsilon\log_bn}-1}{b^\epsilon-1}=n^{\log_ba-\epsilon}\frac{n^\epsilon-1}{b^\epsilon-1} \\
&\leq n^{\log_ba-\epsilon}\frac{n^\epsilon}{b^\epsilon-1}=n^{\log_ba}\frac{1}{b^\epsilon-1}=O(n^{\log_ba})
\end{aligned}
(2)各层均分布: f(n)=\Theta(n^{\log_ba})\implies g(n)=\Theta(n^{\log_ba}\lg n)
\begin{aligned}
g(n)&=\sum_0^{\log_bn-1}a^if(n/b^i)\sim\sum_0^{\log_b n-1}a^i(n/b^i)^{\log_ba} \\
&=n^{\log_ba}\sum_0^{\log_bn-1}a^ib^{-i\log_ba}=n^{\log_ba}\sum_0^{\log_bn-1}a^ia^{-i}\quad(每层一样大) \\
&=n^{\log_ba}\log_bn=\Theta(n^{\log_ba}\lg n)
\end{aligned}
(3)根结点主导: af(n/b)\leq cf(n)\implies g(n)=\Theta(f(n))
\because af(n/b)\leq cf(n)\implies a^if(n/b^i)\leq c^if(n):c<1
\begin{aligned}
\therefore g(n)&=\sum_0^{\log_b n-1}a^if(n/b^i)\leq\sum_0^{\log_b n-1}c^if(n)\quad(取决于最初几层) \\
&\leq f(n)\sum^\infty c^i=f(n)\frac{1}{1-c}=O(f(n))\end{aligned}
\therefore T(n)=\Omega(f(n))\implies T(n)=\Theta(f(n))
引理3: 幂次散点上的总复杂度
引理3: 已知 a\geq1,b>1,f(n):\{b^i\}\mapsto\mathbb{R^+}
总复杂度 T(n):\{b^i\}\mapsto\mathbb{R^+}:\begin{cases}\Theta(1) & n=1 \\
aT(n/b)+f(n) & n=b^i \end{cases}
- 叶结点主导: f(n)= O(n^{\log_ba-\epsilon})\implies T(n)=\Theta(n^{\log_ba})
- 每层均分布: f(n)=\Theta(n^{\log_ba})\implies T(n)=\Theta(n^{\log_ba}\log n)
- 根结点主导: f(n)=\Omega(n^{\log_ba+\epsilon})\land af(n/b)\leq cf(n)\implies T(n)=\Theta(f(n))
(1) T(n)=g(n)+\Theta(n^{\log_b a})=O(n^{\log_ba})+\Theta(n^{\log_b a})=\Theta(n^{\log_ba})
(2) T(n)=g(n)+\Theta(n^{\log_b a})=\Theta(n^{\log_ba}\lg n)+\Theta(n^{\log_b a})=\Theta(n^{\log_ba}\lg n)
(3) T(n)=g(n)+\Theta(n^{\log_b a})=\Theta(f(n))+O(f(n))=\Theta(f(n))
引理4: 整数集上的总复杂度

对于递归式 T(n)=aT(\lceil n/b\rceil)+f(n)
已满足下界 aT(n/b)+f(n)\leq aT(\lceil n/b\rceil)+f(n)
现欲证上界 aT(\lceil n/b\rceil)+f(n)\leq aT(n/b+1)+f(n)
枝结点层\{n_0,\cdots,n_{\lfloor\log_bn\rfloor-1}\}, 叶结点层n_{\lfloor\log_bn\rfloor}
每层结点大小 n_i=\begin{cases}
n & i=0 \\
\lceil n_{i-1}/b\rceil\leq(n_{i-1}/b)+1 & i>0
\end{cases}
\left\{\begin{aligned}
n_0 &\leq n \\
n_1 &\leq (n_0/b)+1=n/b+1 \\
n_2 &\leq (n_1/b)+1=n/b^2+1/b+1 \\
n_3 &\leq (n_2/b)+1=n/b^3+1/b^2+1/b+1 \\
n_i &\leq (n_{i-1}/b)+1=n/b^{i}+\sum_0^{i-1}1/b^k\leq n/b^{i}+\sum_0^\infty1/b^k=n/b^{i}+\frac{b}{b-1} \\
n_{\lfloor\log_bn\rfloor}&\leq \frac{n}{b^{\lfloor\log_bn\rfloor}}+\frac{b}{b-1}<\frac{n}{b^{\log_bn-1}}+\frac{b}{b-1}=b+\frac{b}{b-1}=O(1)
\end{aligned}\right.
递归树总复杂度 T(n)=\sum_0^{\lfloor\log_bn\rfloor-1}a^if(n_i)+\Theta(n^{\log_ba})
- 叶结点主导: f(n)=O(n^{\log_ba-\epsilon})\overset{(1)}\implies f(n_i)=O(\frac{n}{b^i}^{\log_ba-\epsilon})\implies T(n)=\Theta(n^{\log_ba})
- 各层均分布: f(n)=\Theta(n^{\log_ba})\overset{(2)}\implies f(n_i)=\Theta(\frac{n}{b^i}^{\log_ba})\implies T(n)=\Theta(n^{\log_ba}\lg n)
- 根结点主导: f(n)=\Omega(n^{\log_ba+\epsilon})\land af(n/b)\leq cf(n)\overset{(3)}\implies T(n)=\Theta(f(n))
------
(1)叶结点主导: f(n)=O(n^{\log_ba-\epsilon})\overset{(1)}\implies f(n_i)=O(\frac{n}{b^i}^{\log_ba-\epsilon})
然后由 引理3-(1)可知 T(n)=\Theta(n^{\log_ba})
\begin{aligned}
f(n_i) &\leq f(n/b^{i}+\frac{b}{b-1}) \\
&\leq (\frac{n}{b^i}+\frac{b}{b-1})^{\log_ba-\epsilon} \\
&=(\frac{n}{b^i})^{\log_ba-\epsilon}(1+\frac{b^i}{n}\cdot\frac{b}{b-1})^{\log_ba-\epsilon} \\
&\leq (\frac{n}{b^i})^{\log_ba-\epsilon}(1+\frac{b}{b-1})^{\log_ba-\epsilon}=O(\frac{n}{b^i}^{\log_ba-\epsilon}) \\
\end{aligned}
(2)各层均分布: f(n)=\Theta(n^{\log_ba})\overset{(2)}\implies f(n_i)=\Theta(\frac{n}{b^i}^{\log_ba})
然后由 引理3-(2)可知 T(n)=\Theta(n^{\log_ba}\lg n)
\begin{aligned}
\because f(n_i) &\geq f(n/b^{i})=\Omega(\frac{n}{b^i}^{\log_ba}) \\
\because f(n_i) &\leq f(n/b^{i}+\frac{b}{b-1})=O(\frac{n}{b^i}^{\log_ba}) \\
\therefore f(n_i) &=\Theta(\frac{n}{b^i}^{\log_ba})
\end{aligned}
(3)根结点主导: f(n)=\Omega(n^{\log_ba+\epsilon})\land af(n/b)\leq cf(n)
\overset{(3)}\implies f(n_i)=\Omega(\frac{n}{b^i}^{\log_ba+\epsilon})\land a^if(n_i)\leq c^if(n)
\because\exists N_1,\forall n>N_1,af(n/b)\leq cf(n)
\implies\exists N_2>N_1,\forall n>N_2,af(n/b+1)\leq cf(n)
\implies\exists N_2>N_1,\forall n>N_2,a^if(n/b^i+\sum_0^{i-1}1/b^k)\leq c^if(n)
\implies\exists N_3>N_2,\forall n>N_3,a^if(n/b^i+\frac{b}{b-1})\leq c^if(n):c<1
\implies a^if(n_i)\leq a^if(n/b^i+\frac{b}{b-1})\leq c^if(n)
由引理3-(3)可知 T(n)=\Theta(f(n))