分治法主定理
主定理的证明
假设有递归式:
T ( n ) = a T ( n b ) + f ( n ) T(n) = aT(\frac{n}{b}) + f(n) T(n)=aT(bn)+f(n)
证明:
T ( n ) = a T ( n / b ) + f ( n ) T(n) = aT(n/b) + f(n) T(n)=aT(n/b)+f(n) = a [ a T ( n / b 2 ) + f ( n / b ) ] + f ( n ) = a\big[aT(n/b^2)+f(n/b)\big] + f(n) =a[aT(n/b2)+f(n/b)]+f(n) = a 2 T ( n / b 2 ) + f ( n ) + a f ( n / b ) = a^2T(n/b^2) + f(n) + af(n/b) ~\, =a2T(n/b2)+f(n)+af(n/b) = a k T ( n / b k ) + ∑ j = 0 k − 1 a j f ( n / b j ) = a^{k}T(n/b^k) + \sum_{j=0}^{k-1} a^j f(n/b^j) ~~~~ =akT(n/bk)+j=0∑k−1ajf(n/bj) = ⋯ ( 不 妨 设 n 是 b 的 幂 ) = \cdots ~(不妨设n是b的幂)~~~~~~~~~~~~ =⋯ (不妨设n是b的幂) = a l o g b n T ( 1 ) + ∑ j = 0 l o g b n − 1 a j f ( n / b j ) = a^{log_b^n}T(1) + \sum_{j=0}^{log_b^n-1} a^j f(n/b^j) ~~ =alogbnT(1)+j=0∑logbn−1ajf(n/bj)
由对数的换底公式: a l o g b n = b l o g b ( a l o g b n ) = b l o g b a l o g b n = b l o g b n l o g b a = b l o g b ( n l o g b a ) = n l o g b a a^{log_b^n} =b^{log_b^{(a^{log_b^n})}} =b^{log_b^a log_b^n} =b^{log_b^n log_b^a}= b^{log_b^{(n^{log_b^a})}}=n^{log_b^a} alogbn=blogb(alogbn)=blogbalogbn=blogbnlogba=blogb(nlogba)=nlogba
所以原递归式的渐进复杂度为 O ( n l o g b a ) + ∑ j = 0 l o g b n − 1 a j f ( n / b j ) O(n^{log_b^a}) + \sum_{j=0}^{log_b^n-1} a^j f(n/b^j) O(nlogba)+j=0∑logbn−1ajf(n/bj)
简单起见,下面只考虑 f ( n ) = n k f(n) = n^k f(n)=nk 的情形:
∑ j = 0 l o g b n − 1 a j f ( n / b j ) \sum_{j=0}^{log_b^n-1} a^j f(n/b^j) j=0∑logbn−1ajf(n/bj) = ∑ j = 0 l o g b n − 1 a j ( n / b j ) k = \sum_{j=0}^{log_b^n-1} a^j (n/b^j)^k ~~~~~~~ =j=0∑logbn−1aj(n/bj)k = n k ∑ j = 0 l o g b n − 1 ( a / b k ) j = n^k\sum_{j=0}^{log_b^n-1} (a/b^k)^j ~~~~~~~ =nkj=0∑logbn−1(a/bk)j = { n k ( 1 − ( a / b k ) l o g b n 1 − a / b k ) , 如果 a ≠ b k n k ( l o g b n − 1 ) , 如果 a = b k = \left\{ \begin{array}{lr} n^k \left(\frac{1-(a/b^k)^{log_b^n}}{1-a/b^k}\right), & \text{如果$a\neq b^k$}\\ &\\ n^k(log_b^n-1), & \text{如果$a = b^k$} \end{array} \right. =⎩⎪⎨⎪⎧nk(1−a/bk1−(a/bk)logbn),nk(logbn−1),如果a=bk如果a=bk = { O ( n k ) , 如果 a < b k ( k > l o g b a ) O ( n l o g b a ) , 如果 a > b k O ( n k l o g b n ) = O ( n l o g b a l o g b n ) , 如果 a = b k = \left\{ \begin{array}{lr} O(n^k) , & \text{如果$a < b^k(k>log_b^a)$}\\ &\\ O(n^{log_b^a}), & \text{如果$a> b^k$}\\ &\\ O(n^klog_b^n)=O(n^{log_b^a}log_b^n), & \text{如果$a = b^k$} \end{array} \right. =⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧O(nk),O(nlogba),O(nklogbn)=O(nlogbalogbn),如果a<bk(k>logba)如果a>bk如果a=bk
综上所述,对 T ( n ) = a T ( n b ) + f ( n ) T(n) = aT(\frac{n}{b}) + f(n) T(n)=aT(bn)+f(n) 的情形:
T ( n ) = { O ( n k ) , 如果 a < b k ( k > l o g b a ) O ( n l o g b a ) , 如果 a > b k O ( n k l o g b n ) = O ( n l o g b a l o g b n ) , 如果 a = b k T(n)= \left\{ \begin{array}{lr} O(n^k) , & \text{如果$a< b^k(k>log_b^a)$}\\ &\\ O(n^{log_b^a}), & \text{如果$a> b^k$}\\ &\\ O(n^klog_b^n)=O(n^{log_b^a}log_b^n), & \text{如果$a = b^k$} \end{array} \right. T(n)=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧O(nk),O(nlogba),O(nklogbn)=O(nlogbalogbn),如果a<bk(k>logba)如果a>bk如果a=bk