关于主定理的一个简洁的证明

· · 算法·理论

关于主定理的一个简洁的证明

前言

上个赛季某次在 1121 训练时吐槽主定理难证,被翔哥听到骂了一顿,然后他给我讲了一种跟网上主流的证明方法非常不同的方法,仅用到高中学的简单的数列递推和归纳法,令我耳目一新,不过当时一带而过了,并没有记录下来。

直到今天的算法设计与分析课上重新提到了主定理,我再次从网上搜索证明,还是只能搜到那些长篇大论的推导,于是我重新回忆了一下翔哥教给我的推导方法,并打算开个博客记录一下。

定理

主定理适用于求解如下递归式算法的时间复杂度

\begin{aligned} T(n) = aT(\frac{n}{b}) + O(n^d) \end{aligned}

结论为

\begin{aligned} T(n) = \left\{ \begin{aligned} &O(n^d) \ \ \ \ \ \ \ \ &(b^{d} > a) \\ &O(n^d\log n) &(b^{d} = a) \\ &O(n^{\log_{b}a}) &(b^{d} < a) \end{aligned} \right. \end{aligned}

证明

n = b^{k}(如果无法取整,则可以找到最小的 k 使得 b^{k} > n,根据后续结论,这样做对时间复杂度只会产生常数级别的影响),则递归式可写为

\begin{aligned} T(b^{k}) = aT(b^{k - 1}) + O(b^{kd}) \end{aligned}