前言
雖說在學OI的時候學到了非常多的有遞回結構的演算法或方法,也很清楚他們的復雜度,但更多時候只是能夠大概腦補這些方法為什么是這個復雜度,而從未從定理的角度去嚴格證明他們,因此借著這個機會把主定理整個梳理一遍,
介紹
主定理(Master Theorem)提供了用于分析一類有遞回結構演算法時間復雜度的方法,這種遞回演算法通常有這樣的結構:
def solve(problem):
solve_without_recursion()
for subProblem in problem:
solve(subProblem)
我們可以用一種表示方式來概括這些結構的演算法:對于一個規模為\(n\)的問題,我們把它分為\(a\)個子問題,每個子問題規模為\(\frac nb\),那么這種方法的復雜度\(T(n)\)可以表示為:
\[T(n)=a\,T\Big(\frac nb\Big)+f(n) \]其中\(a\ge 1,b>1\)為常數,\(\frac{n}{b}\)指\(\lfloor \frac{n}{b}\rfloor\)或\(\lceil \frac{n}{b}\rceil\),\(f(n)\)為創造這些遞回或者將這些子問題結果整合的函式,對這個方法我們可以建一個遞回樹:

其中樹高為\(\log_bn\),樹的第\(i\)層有\(a^i\)個節點,每個節點的問題規模為\(\frac{n}{b^i}\),則這棵樹有\(a^{\log_bn}=n^{\log_ba}\)個葉子節點,因此這種方法的復雜度也可以表示為:
\[T(n)=\Theta(n^{\log_ba})+\sum_{i=0}^{\log_bn-1}a^if\Big(\frac{n}{b^i}\Big) \]從中我們可以看出,整個方法的復雜度取決于\(f(n)\)的復雜度,主定理對\(f(n)\)分了三種情況:
- \(\exist \varepsilon>0\ s.t.\ f(n)=O(n^{\log_ba-\varepsilon})\),此時\(T(n)=\Theta(n^{\log_ba})\),
- \(f(n)=\Theta(n^{\log_ba})\),此時\(T(n)=\Theta(n^{\log_ba}\lg n)\),
- \(\exist \varepsilon>0\ s.t.\ f(n)=\Omega(n^{\log_ba+\varepsilon})\),且\(\exist c<1\),當\(n\)足夠大時,有\(a\, f(\frac{n}{b})\le c\, f(n)\),此時\(T(n)=\Theta(f(n))\),
\(f(n)\)含\(\log\)的情況類似,待補充,
證明
Case 1
令\(g(n)=\sum_{i=0}^{\log_bn-1}a^if(\frac{n}{b^i})\),由\(f(n)=O(n^{\log_ba-\varepsilon})\),得:
\[g(n)=O\Big(\sum_{i=0}^{\log_bn-1}a^i\Big(\frac{n}{b^i}\Big)^{\log_ba-\varepsilon}\Big) \]之后就是對后面式子的化簡:
\[\begin{aligned} \sum_{i=0}^{\log_bn-1}a^i\Big(\frac{n}{b^i}\Big)^{\log_ba-\varepsilon} &= n^{\log_ba-\varepsilon}\sum_{i=0}^{\log_bn-1}\Big(\frac{ab^\varepsilon}{b^{\log_ba}}\Big)^i\\ &= n^{\log_ba-\varepsilon}\sum_{i=0}^{\log_bn-1}(b^\varepsilon)^i\\ &= n^{\log_ba-\varepsilon}\Big(\frac{(b^\varepsilon)^{\log_bn}-1}{b^\varepsilon-1}\Big)^i\\ &= n^{\log_ba-\varepsilon}\Big(\frac{n^\varepsilon-1}{b^\varepsilon-1}\Big)^i \end{aligned} \]因此\(g(n)=O(\sum_{i=0}^{\log_bn-1}a^i(\frac{n}{b^i})^{\log_ba-\varepsilon})=O(n^{\log_ba})\),所以有:
\[T(n)=\Theta(n^{\log_ba})+O(n^{\log_ba})=\Theta(n^{\log_ba}) \]Case 2
同Case 1,令\(g(n)=\sum_{i=0}^{\log_bn-1}a^if(\frac{n}{b^i})\)得:
\[g(n)=\Theta\Big(\sum_{i=0}^{\log_bn-1}a^i\Big(\frac{n}{b^i}\Big)^{\log_ba}\Big) \]繼續化簡:
\[\begin{aligned} \sum_{i=0}^{\log_bn-1}a^i\Big(\frac{n}{b^i}\Big)^{\log_ba} &= n^{\log_ba}\sum_{i=0}^{\log_bn-1}\Big(\frac{a}{b^{\log_ba}}\Big)^i\\ &= n^{\log_ba}\log_bn \end{aligned} \]因此可得\(g(n)=n^{\log_ba}\log_bn=n^{\log_ba}\lg n\),所以有:
\[T(n)= \Theta(n^{\log_ba})+\Theta(n^{\log_ba}\lg n)=\Theta(n^{\log_ba}\lg n) \]Case 3
還是令\(g(n)=\sum_{i=0}^{\log_bn-1}a^if(\frac{n}{b^i})\),但Case 3這里有一個條件:\(a\, f(\frac{n}{b})\le c\, f(n)\),我們對這個條件做一下處理:
\[\begin{aligned} a\, f\Big(\frac{n}{b}\Big) &\le c\, f(n)\\ \Rightarrow f\Big(\frac{n}{b}\Big) &\le \frac{c}{a}f(n)\\ \Rightarrow f\Big(\frac{n}{b^2}\Big) &\le \frac{c}{a}f\Big(\frac nb\Big)\le\Big(\frac{c}{a}\Big)^2f(n)\\ &\vdots\\ f\Big(\frac{n}{b^i}\Big) &\le\Big(\frac{c}{a}\Big)^if(n)\\ \Rightarrow a^i\, f\Big(\frac{n}{b^i}\Big) &\le c^i\, f(n)\\ \end{aligned} \]由此我們可以很輕易的向下化簡:
\[\begin{aligned} \sum_{i=0}^{\log_bn-1}a^i\Big(\frac{n}{b^i}\Big)^{\log_ba} &\le \sum_{i=0}^{\log_bn-1}c^i\,f(n)+O(1)\\ &\le f(n)\sum_{i=0}c^i+O(1)\\ &=f(n)\Big(\frac{1}{1-c}\Big)+O(1)\\ &=f(n) \end{aligned} \]得\(g(n)=O(f(n))\),又因為\(g(n)=\sum_{i=0}^{\log_bn-1}a^if(\frac{n}{b^i})\ge f(n)\),得\(g(n)=\Omega(f(n))\),因此\(g(n)=\Theta(f(n))\),
所以有:
證畢,
應用
二叉樹建樹
\[T(n)=2T\Big(\frac{n}{2}\Big)+O(1),\ T(n)=O(n) \]此時\(\log_ba<1\),滿足Case 1,
BFPRT(Median of Medians)
\[T(n)\le T\Big(\frac{n}{5}\Big)+\Big(\frac{7n}{10}\Big)+O(n),\ T(n)=O(n) \]此時\(\log_ba>1\),即劃分之后總規模減小(\(1/5+7/10<1\)),滿足Case 2,
歸并排序
\[T(n)=2T\Big(\frac{n}{2}\Big)+O(n),\ T(n)=O(\lg n) \]此時\(\log_ba=1\),滿足Case 3,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/96521.html
標籤:其他
