對主定理(Master Theorem)的理解

前言

雖然說在學OI的時候學到了很是多的有遞歸結構的算法或方法,也很清楚他們的複雜度,但更多時候只是可以大概腦補這些方法爲何是這個複雜度,而從未從定理的角度去嚴格證實他們。所以藉着這個機會把主定理整個梳理一遍。python

介紹

主定理(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)\)分了三種狀況:spa

  1. \(\exist \varepsilon>0\ s.t.\ f(n)=O(n^{\log_ba-\varepsilon})\)。此時\(T(n)=\Theta(n^{\log_ba})\)
  2. \(f(n)=\Theta(n^{\log_ba})\)。此時\(T(n)=\Theta(n^{\log_ba}\lg n)\)
  3. \(\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\)的狀況相似,待補充。3d

證實

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}) \]code

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) \]blog

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)=\Theta(n^{\log_ba})+\Theta(f(n))=\Theta(f(n)) \]
證畢。排序

應用

二叉樹建樹
\[ T(n)=2T\Big(\frac{n}{2}\Big)+O(1),\ T(n)=O(n) \]遞歸

此時\(\log_ba<1\),知足Case 1。rem

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。

相關文章
相關標籤/搜索