主定理
参考文章:时间复杂度及主定理详解,托比欧:主定理 Master Theorem。
简介
在算法分析中,主定理(英语:master theorem)提供了用渐近符号表示许多由分治法得到的递推关系式的方法。
在初赛题目中,主定理可以用来计算形如 \(T(n)=a\times T(n/b) + O(n^{d})\) 的时间复杂度,其中 \(T(n)\) 是我们要求的时间复杂度。
定理
首先我们假设 \(x=\log_{b}a\),那么有以下结论:
\(T(n)=\begin{cases}O(n^{d}) (d > x) \\O(n^{d} \log_{b} n)(d=x) \\O(n^{x})(d<x) \end{cases}\)
上式的意思如下:
我们可以将 \(d\) 看做代表了主公式中的第二项,即将原问题分解成子问题和将子问题的解合并成原问题的解的时间。
推导与证明
如图,首先递推求出这个函数的每一层的时间复杂度,每一层的数量乘上 \(a\),长度除以 \(b\)。于是可以得到第 \(i\) 层的时间复杂度为:\(O(n^{d})(\frac{a}{b^{d}})^{i}\)。而总层数则应该是 \(\log_{b}n\) 层,因为当长度减到 \(0\) 过后就结束了。所以我们可以得出总时间复杂度为:
\(T(n) = \sum_{i=0}^{\log_{b}n} O(n^{d})(\frac{a}{b^{d}})^{i}\)。
仔细观察之后会发现这是一个等比数列,公比为 \(a/b^{d}\)。
然后我们可以分类讨论公比和 \(1\) 之间的大小关系(三种情况:大于 \(1\),等于 \(1\),小于 \(1\)),对于每一种情况再用特殊的方法计算即可。
- \(a/b^{d} > 1\),即 \(d>\log_{b}a\)
如果等比数列的公比大于 \(1\) 的话,那么总时间复杂度应该由第一项来决定。所以直接可以得出:\(T(n)=O(n^{d})\)。
- \(a/b^{d} < 1\),即 \(d<\log_{b}a\)
同理,如果等比数列的公比小于 \(1\) 的话,那么总时间复杂度应该由最后一项来决定。所以:\(T(n)=O(n^{\log_{b}a})\),具体推导过程如下:
首先我们这道这个等比数列的最后一项为:\(O(n^{d})\times (\frac{a}{b^{d}})^{\log_{b}n}\)。于是我们就可以化简原式:
\(O(n^{d})\times (\frac{a}{b^{d}})^{\log_{b}n}=O(n^{d})\times (\frac{a^{log_{b}n}}{b^{d\log_{b}n}})=O(n^{d}\times (\frac{a^{log_{b}n}}{n^{d}}))=O(a^{\log_{b}n})\)。
\(\because \frac{\log_{a}n}{\log_{a}b}=\log_{b}n\)
\(\therefore a^{\log_{b}n}=a^{\frac{\log_{a}n}{\log_{a}b}}=(a^{\log_{a}n})^{\frac{1}{\log_{a}b}}=n^{\frac{1}{\log_{a}b}}\)
又 \(\because \frac{1}{\log_{a}b}=\log_{b}a\)
\(\therefore O(n^{\frac{1}{\log_{a}b}})=O(n^{\log_{b}a})\)
于是得证。
- \(a/b^{d} = 1\),即 \(d=\log_{b}a\)
这个时候就必须求和了,因为每一项的大小都一样大(因为公比为 \(1\)),所以直接用第一项乘以项数就行了,即:\(T(n)=O(n^{d})*(\log_{b}a+1)=O(n^{d}\log_{b}a)\)。
证毕。
具体详见这篇文章。