主定理是分析分治算法复杂度的一个工具。 设分治的时间复杂度为 T ( n ) T(n) T(n),其中 n n n 为数据规模,且满足递推式: T ( n ) = a T ( n b ) + O ( n d ) T(n)=aT(\dfrac nb)+O(n^d) T(n)=aT(bn)+O(nd) 则有 T ( n ) = { O ( n d ) log b a < d O ( n d log b n ) log b a = d O ( n log b a ) log b a > d T(n)=\begin{cases}O(n^d)&&&\log_ba<d\\O(n^d\log_bn)&&&\log_ba=d\\O(n^{\log_ba})&&&\log_ba>d\end{cases} T(n)=⎩⎪⎨⎪⎧O(nd)O(ndlogbn)O(nlogba)logba<dlogba=dlogba>d
推导: 不妨暴力展开柿子,得到: T ( n ) = O ( n d + a ( n / b ) d + a 2 ( n / b 2 ) d + ⋯ ) = O ( n d ) ∑ k = 0 log b n ( a b d ) k \displaystyle T(n)=O(n^d+a(n/b)^d+a^2(n/b^2)^d+\cdots)=O(n^d)\sum_{k=0}^{\log_bn}\left(\dfrac a{b^d}\right)^k T(n)=O(nd+a(n/b)d+a2(n/b2)d+⋯)=O(nd)k=0∑logbn(bda)k 当 a b d < 1 \dfrac a{b^d}<1 bda<1 时,即 d > log b a d>\log_ba d>logba, T ( n ) = O ( n d ) T(n)=O(n^d) T(n)=O(nd) 当 d = log b a d=\log_ba d=logba 时, T ( n ) = O ( n d log b n ) T(n)=O(n^d\log_bn) T(n)=O(ndlogbn) 当 d > log b a d>\log_ba d>logba 时, T ( n ) = O ( n d ( a b d ) log b n ) = O ( n d a log b n b − d log b n ) = O ( n log b a ) T(n)=O\left(n^d\left(\dfrac a{b^d}\right)^{\log_bn}\right)=O(n^da^{\log_bn}b^{-d\log_bn})=O(n^{\log_ba}) T(n)=O(nd(bda)logbn)=O(ndalogbnb−dlogbn)=O(nlogba)