主定理学习笔记

主定理(Master Theorem)是用于分析分治算法复杂度的重要定理。

前置知识

渐进符号的概念

1. \(\mathcal{\Theta}\)(紧确渐进界)

若存在正常数 \(c_1,c_2,n_0\) 使得 \(\forall n\ge n_0\) 都有:

\0\\le c_1\\cdot g(n)\\le f(n)\\le c_2\\cdot g(n) \\

则记 \(f(n)=\mathcal{\Theta}(g(n))\)。\(\mathcal{\Theta}\) 是等价关系,表示 \(f,g\) 增长速度同阶,类似 \(=\)。

2. \(\mathcal{O}\)(渐进上界)

若存在正常数 \(c,n_0\) 使得 \(\forall n\ge n_0\) 都有:

\0\\le f(n)\\le c\\cdot g(n) \\

则记 \(f(n)=\mathcal{O}(g(n))\)。\(\mathcal{O}\) 是拟序关系,类似 \(\le\)(小于等于)。

3. \(\mathcal{\Omega}\)(渐进下界)

若存在正常数 \(c,n_0\) 使得 \(\forall n\ge n_0\) 都有:

\0\\le c\\cdot g(n)\\le f(n) \\

则记 \(f(n)=\mathcal{\Omega}(g(n))\)。\(\mathcal{\Omega}\) 也是拟序关系,类似 \(\ge\)(大于等于)。

三者如下图所示。

常用性质

  1. \(f(n)=\mathcal{\Theta}(g(n))\Leftrightarrow f(n)=\mathcal{O}(g(n)) \land f(n)=\mathcal{\Omega}(g(n))\)
  2. \(f(n)=\mathcal{\Theta}(f(n))\)
  3. \(c\cdot \mathcal{\Theta}(f(n))=\mathcal{\Theta}(f(n))\)(\(c>0\) 且 \(c\) 与 \(n\) 无关)
  4. \(\mathcal{\Theta}(f(n))+\mathcal{\Theta}(g(n))=\mathcal{\Theta}(f(n)+g(n))=\mathcal{\Theta}(\max(f(n),g(n)))\)
  5. \(\mathcal{\Theta}(f(n))\mathcal{\Theta}(g(n))=\mathcal{\Theta}(f(n)g(n))\)
  6. \(\mathcal{\Theta}(\log_b n)=\mathcal{\Theta}(\log_2 n)\)(\(b>1\))

性质 2~6 同样适用于 \(\mathcal{O}\) 和 \(\mathcal{\Omega}\)

这些性质会在后面的证明中用到。

主定理简化版

设 \(T\left(n\right)\) 为分治算法处理规模为 \(n\) 的问题的复杂度,且满足:

\T\\left(n\\right)= \\begin{cases} aT\\left(\\frac{n}{b}\\right)+\\mathcal{O}\\left(n\^d\\right) \& \\text{if}\\;n\\ge b\\\\ \\mathcal{O}\\left(1\\right) \& \\text{if}\\;n\

其中:

  • \(a\):子问题个数(\(a\in \mathbb{Z},a\ge 1\))。
  • \(\frac{n}{b}\):每个子问题大小(\(b\in \mathbb{R},b>1\))。
  • \(\mathcal{O}\left(n^d\right)\):合并子问题的解得到原问题解的额外复杂度(\(d\ge 0\))。

则有:

\T\\left(n\\right)=\\begin{cases} \\mathcal{O}\\left(n\^{\\log_b a}\\right) \& \\text{if} \\; d\<\\log_b a \\\\ \\mathcal{O}\\left(n\^d \\log n\\right) \& \\text{if} \\; d=\\log_b a \\\\ \\mathcal{O}\\left(n\^d\\right) \& \\text{if} \\; d\>\\log_b a \\end{cases} \\

这对于 OI 来说已经够用了。

例子

  • 对于归并排序,\(a=2,b=2,d=1\),有 \(d=\log_ba\),因此时间复杂度为 \(O(n\log n)\)。
  • 对于 \(a=2,b=2,d=2\) 的完全二叉树上背包问题,有 \(d>\log_ba\),因此时间复杂度为 \(O(n^2)\)。

证明

不失一般性地,假设 \(n\) 是 \(b\) 的整数次幂。

考虑递归树。若根节点算一层,则树高为 \(\log_b n+1\)。单独计算叶子节点,展开得:

\\\begin{aligned} T\\left(n\\right)\&=\\mathcal{O}\\left(a\^{\\log_bn}\\right)+\\sum_{k=0}\^{\\log_b n-1}a\^k\\cdot \\mathcal{O}\\left(\\left(\\frac{n}{b\^k}\\right)\^d\\right)\\\\ \&=\\mathcal{O}\\left(a\^{\\log_bn}\\right)+\\sum_{k=0}\^{\\log_b n-1}\\mathcal{O}\\left(a\^k\\right)\\cdot \\mathcal{O}\\left(\\left(\\frac{n}{b\^k}\\right)\^d\\right)\\\\ \&=\\mathcal{O}\\left(n\^{\\log_ba}\\right)+\\sum_{k=0}\^{\\log_b n-1}\\mathcal{O}\\left(a\^k\\cdot \\frac{n\^d}{\\left(b\^d\\right)\^k}\\right)\\\\ \&=\\mathcal{O}\\left(n\^{\\log_ba}\\right)+\\sum_{k=0}\^{\\log_b n-1}\\mathcal{O}\\left(\\left(\\frac{a}{b\^d}\\right)\^k\\cdot n\^d\\right)\\\\ \&=\\mathcal{O}\\left(n\^{\\log_ba}\\right)+\\mathcal{O}\\left(\\sum_{k=0}\^{\\log_b n-1}\\left(\\frac{a}{b\^d}\\right)\^k\\cdot n\^d\\right)\\\\ \&=\\mathcal{O}\\left(n\^{\\log_ba}\\right)+\\mathcal{O}\\left(n\^d\\cdot\\sum_{k=0}\^{\\log_b n-1}\\left(\\frac{a}{b\^d}\\right)\^k\\right)\\\\ \\end{aligned} \\

设 \(p=\frac{a}{b^d}\),则:

\\\begin{cases} p\>1 \& \\text{if} \\; d\<\\log_ba \\\\ p=1 \& \\text{if} \\; d=\\log_ba \\\\ 0\\\log_ba \\\\ \\end{cases} \\

\T\\left(n\\right)=\\mathcal{O}\\left(n\^{\\log_ba}\\right)+\\mathcal{O}\\left(n\^d\\cdot\\sum_{k=0}\^{\\log_b n-1}p\^k\\right) \\

情况 1(\(d<\log_ba\))

此时 \(p>1\)。

由等比数列求和公式,得:

\\\begin{aligned} T\\left(n\\right)\&=\\mathcal{O}\\left(n\^{\\log_ba}\\right)+\\mathcal{O}\\left(n\^d\\cdot \\frac{p\^{\\log_bn}-1}{p-1}\\right)\\\\ \&=\\mathcal{O}\\left(n\^{\\log_ba}\\right)+\\mathcal{O}\\left(n\^d\\cdot \\left(p\^{\\log_bn}-1\\right)\\right)\\\\ \&=\\mathcal{O}\\left(n\^{\\log_ba}\\right)+\\mathcal{O}\\left(n\^d\\cdot \\left(\\left(\\frac{a}{b\^d}\\right)\^{\\log_bn}-1\\right)\\right)\\\\ \&=\\mathcal{O}\\left(n\^{\\log_ba}\\right)+\\mathcal{O}\\left(n\^d\\cdot \\left(\\frac{a\^{\\log_bn}}{b\^{d\\log_bn}}-1\\right)\\right)\\\\ \&=\\mathcal{O}\\left(n\^{\\log_ba}\\right)+\\mathcal{O}\\left(n\^d\\cdot\\left(\\frac{n\^{\\log_b a}}{n\^d}-1\\right)\\right)\\\\ \&=\\mathcal{O}\\left(n\^{\\log_ba}\\right)+\\mathcal{O}\\left(n\^{\\log_b a}-n\^d\\right)\\\\ \&=\\mathcal{O}\\left(n\^{\\log_ba}\\right) \\end{aligned} \\

情况 2(\(d=\log_ba\))

此时 \(p=1\)。

\\\begin{aligned} T\\left(n\\right)\&=\\mathcal{O}\\left(n\^{\\log_ba}\\right)+\\mathcal{O}\\left(n\^d\\cdot \\log_bn\\right)\\\\ \&=\\mathcal{O}\\left(n\^{\\log_ba}\\right)+\\mathcal{O}\\left(n\^d\\log n\\right)\\\\ \&=\\mathcal{O}\\left(n\^d\\log n\\right) \\end{aligned} \\

情况 3(\(d>\log_ba\))

此时 \(0<p<1\)。

由等比数列求和公式,得:

\\\begin{aligned} T\\left(n\\right)\&=\\mathcal{O}\\left(n\^{\\log_ba}\\right)+\\mathcal{O}\\left(n\^d\\cdot \\frac{p\^{\\log_bn}-1}{p-1}\\right)\\\\ \&=\\mathcal{O}\\left(n\^{\\log_ba}\\right)+\\mathcal{O}\\left(n\^d\\cdot \\frac{1-p\^{\\log_bn}}{1-p}\\right)\\\\ \&=\\mathcal{O}\\left(n\^{\\log_ba}\\right)+\\mathcal{O}\\left(n\^d\\right)\\cdot \\mathcal{O}\\left(1\\right)\\\\ \&=\\mathcal{O}\\left(n\^d\\right) \\end{aligned} \\

注意 \(p-1<0\),故应将分母化为 \(1-p\)。

证毕。

主定理完整版

\(\mathcal{O}(n^d)\) 被换成了更一般的 \(f(n)\)。

\T(n)=aT(\\frac{n}{b})+f(n)\\quad(n\\ge b) \\

则有:

\T(n)=\\begin{cases} \\Theta(n\^{\\log_b a}) \& \\text{if}\\;f(n)=O(n\^{\\log_b a-\\epsilon})\\\\ \\Theta(f(n)) \& \\text{if}\\;f(n)=\\Omega(n\^{\\log_b a+\\epsilon})\\\\ \\Theta(n\^{\\log_b a}\\log\^{k+1}n) \& \\text{if}\\;f(n)=\\Theta(n\^{\\log_b a}\\log\^k n) \\end{cases} \\

其中 \(\epsilon>0,k\ge 0\)。

注意其中第二条还必须满足存在正常数 \(c<1,n_0\) 使得 \(\forall n\ge n_0\) 都有 \(a f(\frac{n}{b}) \le c f(n)\)。

证明比较繁琐,这里不作展开。思路大致就是代入关于 \(f(n)\) 的渐进符号然后化简。