浅谈扩展主定理(Extended Master Theorem)

· · 算法·理论

一些约定

T(n)=aT(\dfrac{n}{b})+f(n),T(1)=O(1),\epsilon>0

主定理

这里就不多说了,形式与证明都可以看这篇文章,里面提到的主定理是这样的(这里面的公式与我们常用的有一点不同,但是严格包含我们常用的主定理):

T(n)=\begin{cases} \Theta(n^{\log_ba}) & f(n)=\mathcal{O}(n^{(\log_ba)-\epsilon}) \\ \Theta(f(n)) & f(n)=\Omega(n^{(\log_ba)+\epsilon}) \\ \Theta(n^{\log_ba}\log^{k+1} n) & f(n)=\Theta(n^{\log_ba}\log^kn),k \ge 0 \end{cases}

注意第二条中还应该存在 c<1 满足在 n 足够大时 af(\dfrac{n}{b}) \le cf(n)

扩展主定理

扩展主定理将主定理中的第三条的 k 的范围从 k \ge 0 扩展到了任意实数,它的形式如下:

T(n)=\begin{cases} \Theta(n^{\log_ba}) & f(n)=\mathcal{O}(n^{(\log_ba)-\epsilon})\\ \Theta(n^{\log_ba}\log^{k+1} n) & f(n)=\Theta(n^{\log_ba}\log^kn),k>-1\\ \Theta(n^{\log_ba}\log\log n) & f(n)=\Theta(n^{\log_ba}\log^{-1}n)\\ \Theta(n^{\log_ba}) & f(n)=\Theta(n^{\log_ba}\log^kn),k<-1\\ \Theta(f(n)) & f(n)=\Omega(n^{(\log_ba)+\epsilon}) \end{cases}

同理,第五条中还应该存在 c<1 满足在 n 足够大时 af(\dfrac{n}{b}) \le cf(n)

证明

这一部分不是我想的。

我们只需要证明第二到四条,接下来我们设 m=\log_bn 且公式统一使用小括号。

展开并带入

我们先展开递归树,那么第零层贡献为 f(n),第 i 层贡献为 a^if(\dfrac{n}{b^i}),而递归树有 a^m=n^{\log_ba} 个叶子,每个叶子代价为 \Theta(1)
综上 T(n) 可以表示为:

T(n)=\Theta(\sum_{i=0}^{m-1}a^if(\dfrac{n}{b^i}))+\Theta(n^{\log_ba})

f(n)=\Theta(n^{\log_ba}\log^kn) 时,就有:

f(\dfrac{n}{b^i})=\Theta((\dfrac{n}{b^i})^{\log_ba}\log^k(\dfrac{n}{b^i}))

又因为:

(\dfrac{n}{b^i})^{\log_ba}=n^{\log_ba} \times b^{-i\log_ba}=n^{\log_ba} \times a^{-i}\\ \log(\dfrac{n}{b^i})=(\log n)-i(\log b)

所以有:

f(\dfrac{n}{b^i})=\Theta(n^{\log_ba}a^{-i}((\log n)-i(\log b))^k)

带入 T(n) 的求和式子得到:

T(n)=\Theta(n^{\log_ba}(\sum_{i=0}^{m-1}a^ia^{-i}((\log n)-i(\log b))^k))+\Theta(n^{\log_ba})=\Theta(n^{\log_ba}(\sum_{i=0}^{m-1}((\log n)-i(\log b))^k))+\Theta(n^{\log_ba})

j=m-i,则求和部分变为:

\begin{align*} & \Theta(\sum_{i=0}^{m-1}((\log n)-i(\log b))^k)\\ & =\Theta(\sum_{j=1}^{m}((\log n)-(m-j)(\log b))^k)\\ & =\Theta(\sum_{j=1}^{m}((\log n)-m(\log b)+j(\log b))^k)\\ & =\Theta(\sum_{j=1}^{m}((\log n)-(\log n)+j(\log b))^k)\\ & =\Theta(\sum_{j=1}^{m}(j\log b)^k)\\ & =\Theta(\log^k b\sum_{j=1}^{m}j^k) \end{align*}

因此,我们得到:

T(n)=\Theta(n^{\log_ba}\log^k b\sum_{j=1}^{m}j^k)+\Theta(n^{\log_ba})

分析渐进结果

关键在于 \sum_{j=1}^{m}j^k 部分的结果,根据 k 的取值分类讨论。

k>-1 时,有以下结果:

\Theta(\sum_{j=1}^{m}j^k)=\Theta(\int_0^mx^k\mathrm{d}x)=\Theta(\dfrac{m^{k+1}}{k+1})=\Theta(m^{k+1})

此时 T(n) 为:

\begin{align*} &\Theta(n^{\log_ba}\log^k b \cdot m^{k+1})\\ &=\Theta(n^{\log_ba}\log^k b \cdot (\dfrac{\log n}{\log b})^{k+1})\\ &=\Theta(n^{\log_ba}\log^k b \cdot (\dfrac{\log^{k+1} n}{\log^{k+1} b}))\\ &=\Theta(n^{\log_ba} \cdot (\dfrac{\log^{k+1} n}{\log b}))\\ &=\Theta(n^{\log_ba}{\log^{k+1} n}) \end{align*}

k=-1 时,求和将变成调和级数的形式:

\Theta(\sum_{j=1}^{m}j^k)=\Theta(\sum_{j=1}^{m}\dfrac{1}{j})=\Theta(\log m)=\Theta(\log \log n)

此时就有:

T(n)=\Theta(n^{\log_ba}\log^{-1} b\log\log n)=\Theta(n^{\log_ba}\log\log n)

k<-1 时,求和将会收敛,所以会有:

\Theta(\sum_{j=1}^{m}j^k)=\Theta(1)

因此就会有:

T(n)=\Theta(n^{\log_ba})

综上,我们证明了扩展主定理的所有扩展部分。

使用示例

假设现在 T(n)=2T(\dfrac{n}{2})+\Theta(\dfrac{n}{\log n})
我们发现这个函数不能使用标准主定理,但是可以使用我们的扩展主定理。
这里 f(n)=n\log^{-1}n,满足扩展主定理的第三条,所以有:

T(n)=\Theta(n^{\log_22}\log\log n)=\Theta(n\log\log n)

至此,我们将主定理的应用范围扩展到了几乎所有 f(n)=n^p\log^qn 的情况。