主定理与主方法的使用
主定理
令 $a \geqslant 1$ 和 $b > 1$ 是常数, $f(n)$ 是一个函数, $T(n)$ 是定义在非负整数上的递归式:
$$T(n) = aT(n/b) + f(n)$$
其中我们将 $n/b$ 解释为 $\left \lfloor n/b \right \rfloor$ 或 $\left \lceil n/b \right \rceil$. 那么 $T(n)$ 有如下渐进界:
- 若对某个常数
$\varepsilon > 0$有$f(n) = O(n^{log_{b}a - \varepsilon})$, 则$T(n) = \Theta(n^{log_{b}a})$. - 若
$f(n) = \Theta(n^{log_{b}a})$, 则$T(n) = O(n^{log_{b}a}lgn)$. - 若对某个常数
$\varepsilon > 0$有$f(n) = \Omega(n^{log_{b}a + \varepsilon})$, 且对某个常数$c < 1$和所有足够大的$n$有$af(n/b) \leqslant cf(n)$, 则$T(n) = \Theta(f(n))$.
使用主方法
使用主方法很简单, 我们只需确定主定理的哪种情况成立, 即可得到解.
我们看下面的例子
$$T(n) = 9T(n/3) + n$$
对于这个递归式, 我们有 $a = 9$, $b = 3$, $f(n) = n$, 因此 $n^{log_{b}a} = n^{log_{3}9} = \Theta(n^2)$. 由于 $f(n) = O(n^{log_{3}9 - \varepsilon})$, 其中 $\varepsilon = 1$, 因此可以应用主定理的情况 1, 从而得到解 $T(n) = \Theta(n^2)$.
参考
《算法导论》(中文版)
主定理与主方法的使用
http://fanlumaster.github.io/2021/05/30/主定理与主方法的使用/