Tag 递推数列 上有很多类似的问答
Master theorem的推广形式包括Akra–Bazzi method.
https://oi-wiki.org/basic/complexity/#主定理-master-theorem主定理 (Master Theorem)
Master Theorem 递推关系式如下
$$
T(n) = a T\left(\frac{n}{b}\right)+f(n)\qquad \forall n > b
$$
那么
$$
T(n) = \begin{cases}\Theta(n^{\log_b a}) & f(n) = O(n^{\log_b (a)-\epsilon}),\epsilon > 0 \\\Theta(f(n)) & f(n) = \Omega(n^{\log_b (a)+\epsilon}),\epsilon\ge 0\\\Theta(n^{\log_b a}\log^{k+1} n) & f(n)=\Theta(n^{\log_b a}\log^k n),k\ge 0 \end{cases}
$$
需要注意的是,这里的第二种情况还需要满足 regularity condition, 即 $a f(n/b) \leq c f(n)$,for some constant $c < 1$ and sufficiently large $n$。
证明思路是是将规模为 $n$ 的问题,分解为 $a$ 个规模为 $(\frac{n}{b})$ 的问题,然后依次合并,直到合并到最高层。每一次合并子问题,都需要花费 $f(n)$ 的时间。
依据上文提到的证明思路,具体证明过程如下对于第 $0$ 层(最高层),合并子问题需要花费 $f(n)$ 的时间 对于第 $1$ 层(第一次划分出来的子问题),共有 $a$ 个子问题,每个子问题合并需要花费 $f\left(\frac{n}{b}\right)$ 的时间,所以合并总共要花费 $a f\left(\frac{n}{b}\right)$ 的时间。 层层递推,我们可以写出类推树如下:
这棵树的高度为 ${\log_b n}$,共有 $n^{\log_b a}$ 个叶子,从而 $T(n) = \Theta(n^{\log_b a}) + g(n)$,其中 $g(n) = \sum_{j = 0}^{\log_{b}{n - 1}} a^{j} f(n / b^{j})$。 针对于第一种情况:$f(n) = O(n^{\log_b a-\epsilon})$,因此 $g(n) = O(n^{\log_b a})$。 对于第二种情况而言:首先 $g(n) = \Omega(f(n))$,又因为 $a f(\dfrac{n}{b}) \leq c f(n)$,只要 $c$ 的取值是一个足够小的正数,且 $n$ 的取值足够大,因此可以推导出:$g(n) = O(f(n)$)。两侧夹逼可以得出,$g(n) = \Theta(f(n))$。 而对于第三种情况:$f(n) = \Theta(n^{\log_b a})$,因此 $g(n) = O(n^{\log_b a} {\log n})$。$T(n)$ 的结果可在 $g(n)$ 得出后显然得到。
下面举几个例子来说明主定理如何使用。
$T(n) = 2T\left(\frac{n}{2}\right) + 1$,那么 $a=2, b=2, {\log_2 2} = 1$,那么 $\epsilon$ 可以取值在 $(0, 1]$ 之间,从而满足第一种情况,所以 $T(n) = \Theta(n)$。
$T(n) = T\left(\frac{n}{2}\right) + n$,那么 $a=1, b=2, {\log_2 1} = 0$,那么 $\epsilon$ 可以取值在 $(0, 1]$ 之间,从而满足第二种情况,所以 $T(n) = \Theta(n)$。
$T(n) = T\left(\frac{n}{2}\right) + {\log n}$,那么 $a=1, b=2, {\log_2 1}=0$,那么 $k$ 可以取值为 $1$,从而满足第三种情况,所以 $T(n) = \Theta(\log^2 n)$。
$T(n) = T\left(\frac{n}{2}\right) + 1$,那么 $a=1, b=2, {\log_2 1} = 0$,那么 $k$ 可以取值为 $0$,从而满足第三种情况,所以 $T(n) = \Theta(\log n)$。
|