主方法


轉自 https://www.jianshu.com/p/4d0b005782d9

閱讀經典——《算法導論》04

在算法分析中,我們通常會得到一個關於輸入規模n的遞歸式,形式如下:

<small>(式4-1)</small>

T(n) = aT(n/b) + f(n)

例如,歸並排序遞歸式 T(n) = 2T(n/2) + cn ,Strassen算法遞歸式 T(n) = 7T(n/2) + Θ(n2) 等等。

但是有了這些遞歸式還不夠,我們需要確切的知道T(n)到底是多少,它與n的關系如何。

因此,本文講述一種求解上述形式的遞歸式的一般方法,稱為主方法。該方法簡單易行,通常不需要借助紙筆演算。

遞歸式(4-1)描述的是這樣一種算法的運行時間:它將規模為n的問題分解為a個子問題,每個子問題規模為n/b,其中a和b都是正常數。a個子問題遞歸地進行求解,每個花費時間T(n/b)。函數f(n)包含了問題分解和子問題解合並的代價。例如,描述Strassen算法的遞歸式中,a=7,b=2,f(n) = Θ(n2) 。

主定理

下面給出主方法所依賴的定理。

定理4.1(主定理) 令 a≥1 和 b>1 是常數,f(n) 是一個函數,T(n) 是定義在非負整數上的遞歸式:
T(n) = aT(n/b) + f(n)
那么T(n)有如下漸進界:

  1. 若對某個常數 ε>0 有 f(n) = O(nlogba-ε),則 T(n) = Θ(nlogba) 。
  2. 若 f(n) = Θ(nlogba),則 T(n) = Θ(nlogba lgn) 。
  3. 若對某個常數 ε>0 有 f(n) = Ω(nlogba+ε),且對某個常數 c<1 和所有足夠大的 n 有 af(n/b) ≤ cf(n),則 T(n) = Θ(f(n)) 。

讓我們嘗試了解主定理的含義。對於三種情況,我們都將函數 f(n) 與函數 nlogba 進行比較。直覺上,遞歸式的解取決於兩個函數中的較大者。如情況一是 nlogba 較大,情況3是 f(n) 較大。而情況2是兩者一樣大,這種情況需要乘上一個對數因子。

需要注意的是,兩個函數比較大小時必須確保多項式意義上的小於,也就是說,兩者必須相差一個因子 nε,其中 ε 是大於0的常數。另外情況3還需要滿足一個額外的條件。

使用主方法

舉幾個例子就能很容易說明如何使用主方法。

案例1:

T(n) = 9T(n/3) + n

對於這個遞歸式,我們有 a = 9,b = 3, f(n) = n,因此 nlogba = nlog39 = Θ(n2) 。而 f(n) = n 漸進小於 Θ(n2),所以可以應用於主定理的情況1,從而得到解 T(n) = Θ(n2) 。

案例2:

T(n) = T(2n/3) + 1

其中,a = 1, b = 3/2, f(n) = 1,因此 nlogba = nlog3/21 = n0 = 1 。由於 f(n) = Θ(1) ,與Θ(nlogba)恰好相等,可應用於情況2,從而得到解 T(n) = Θ(lgn) 。

案例3:

T(n) = 3T(n/4) + nlgn

我們有 a = 3,b = 4,f(n) = nlgn,因此nlogba = nlog43 = O(n0.793) 。由於 f(n) = Θ(nlgn) = Ω(n) = Ω(n0.793+0.207),因此可以考慮應用於情況3,其中 ε = 0.207。但需要檢查是否滿足條件:當 n 足夠大時,存在 c<1 使 af(n/b) ≤ cf(n) 。

  • 令 3f(n/4) ≤ cf(n) 有
    3n/4lg(n/4) ≤ cnlgn
    3/4(lgn - lg4) ≤ clgn
    (3/4 - c)lgn ≤ 3/4lg4

容易發現,當 c ≥ 3/4 時,上式對於足夠大的 n 恆成立。因此可以使用主定理的情況3,得出遞歸式的解為 T(n) = Θ(nlgn) 。



作者:金戈大王
鏈接:https://www.jianshu.com/p/4d0b005782d9
來源:簡書


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM