在分析根據遞歸方程分析算法的時間複雜度時,常見到如下形式的方程,
T(n) = a * T(n/b) + f(n)
a ³ 1,b > 1,f(n)一般是個簡單函數
這時可以有2種方法,來計算時間複雜度。一是用遞歸樹,逐層代入原式,最終形成一個級數,
然後用一個函數來表達,得到T(n)。
二是應用主項定理Master Method 。其實,主項定理也就是對遞歸樹方法的一種歸納,形成了
固定的計算方式,並分三種情形來計算。
這三種情形主要是比較 nlogba 與 f(n),爲什麼要比較這兩個函數呢?
觀察原式,可以看出,nlogba其實相當於用遞歸樹方法解出的遞歸方程的右側的第一項,
而f(n)則是遞歸方程的右側的第二項,這樣,主項定理實際上是在比較組成結果的兩個函數項,
而且這種比較是按照數量級(或者說是變化幅度)來比較的,也就是說,如2n 與 28n是
數量級(變化幅度)相當的。
這樣就有了三種不同的情形:
-
f(n) < nlogba
也就是 f(n) = O(nlogba - e ) ,e > 0爲任意小的常數
或者說,f(n) 比 nlogba變化的慢,慢ne
那麼,T(n) Î Q (nlogba) -
f(n) > nlogba
也就是 f(n) = W(nlogba +e ) ,e > 0爲任意小的常數
或者說,f(n) 比 nlogba變化的快,快ne
那麼, T(n) Î Q(f(n))可以簡單地說,遞歸方程的右側的兩項,哪項變化的塊,T(n)就屬於哪項的數量級
-
f(n) = nlogba
也就是兩項的數量級相當,就給這個數量級乘上一個lg n
T(n) Î Q(nlogba * lg n)
Examples(以下示例來源於網絡):
-
T(n) = 5T(n/2) + Q(n2)
Case 1: If f(n) = O(nlogba - e ) for some constant e > 0 then T(n) Î Q(nlogba)
Determine: a, b, f(n) and logba
-
a = 5
-
b = 2
-
f(n) = Q(n2)
-
logb a = log2 5 ≈ 2.32
Is f(n) Î O(nlg 5 - e) for e > 0 ?
Yes. f(n) = Q(n2) Î O(nlg 5 - e) = O(n2.32 - e) for e ≈ 0.32
T(n) Î Q(nlog25)
-
2. T(n) = 2T(n/2) + n
Determine: a, b, f(n) and logb(a)
a = 2
b = 2
f(n) = n
logb a = log2 2 = lg 2 = 1
Case 3: If f(n) = Q(nlogba ) then T(n) Î Q(nlogba lg n)
f(n) = n Î Q(nlog22) = Q(n1)
T(n) Î Q(nlog22 lg n) = Q(n lg n)
3. T(n) = 5T(n/2) + Q(n3)
Determine: a, b, f(n) and logb(a)
a = 5
b = 2
f(n) = Q(n3)
logb a = log2 5 ≈ 2.32
Case 2: If f(n) = W(nlogba+e ) for some constant e > 0
f(n) = Q(n3) Î W(nlog25+e ) = W(n2.32+e ) for e ≈0.68
and af(n/b) ≤ cf(n) for some constant c < 1 and all sufficiently large n
5(n/2)3≤ cn3
5n3/8 ≤ cn3
c = 5/8 < 1
then T(n) Î Q(n3)