算法設計關於遞歸方程T(n)=aT(n/b)+f(n)之通用解法


算法設計關於遞歸方程T(n)=aT(n/b)+f(n)之通用解法

在算法設計中經常需要通過遞歸方程估計算法的時間復雜度T(n),本文針對形如T(n)=aT(n/b)+f(n)的遞歸方程進行討論,以期望找出通用的遞歸方程的求解方式。

算法設計教材中給出的Master定理可以解決該類方程的絕大多數情況,根據Master定理:o-漸進上界、w-漸進下界、O-漸進確界。

a1b1為常數,f(n)為函數,T(n)=aT(n/b)+f(n)為非負數,x=logba

1.       f(n)=o(nx-e)e0,那么T(n)=O(nx)

2.       f(n)=O(nx),那么T(n)=O(nx logn)

3.       f(n)=w(nx+e)e0且對於某個常數c1和所有充分大的naf(n/b)cf(n),那么T(n)=O(f(n))

然而,Master定理並沒有完全包括所有的f(n)的情況。注意到條件13中的e總是大於0的,所以在條件12、條件23之間存在所謂的“間隙”,使得某些f(n)在該情況下不能使用該定理。因此,我們需要找到在Master定理不能使用的情況下如何解遞歸方程的比較通用的辦法——遞歸樹。

經過分析,遞歸樹解法包含了Master定理,但是Master定理可以方便的判斷出遞歸方程的解。產生這種結果的原因關鍵在於f(n)的形式,顯然,當f(n)n的多項式p(n)形式的話必然滿足Master定理的要求,但是f(n)不是多項式就需要另當別論了。

下面就題目所列出的遞歸方程形式進行分析。

f(n)n的多項式p(n)=f(n)

因為f(n)是多項式,設p(n)=O(nk)k0。根據遞歸樹計算方式,有:

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

              T(n/b)= aT(n/b2)+(n/b)k

              T((n/b2)= aT(n/b3)+( n/b2)k

              ……

       於是得到:T(n)= nk (1+ a/ bk + (a/ bk)2 + (a/ bk)3 +···+ (a/ bk)h)h=logbn

       1logba=k

              這種情況下a/ bk= 1,顯然T(n)= O(nk logbn)

       2logbak

              此時等比數列公比不是1,根據等比數列求和公式化簡得到:

T(n)=( nk –nx)/(1-a/bk)x=logba

如果logba<k,則T(n)= O(nk)

如果logba>k,則T(n)= O(nx)x=logba

       通過以上的計算表明,在Master定理的條件中,針對f(n)為多項式的情況可以使用遞歸樹的方法進行證明和計算。同樣,在f(n)不是多項式的時候也可以通過的這種方式得到方程的解。

f(n)是一般函數

f(n)不是n的多項式的時候,計算就會變得比較復雜,有時可能會也找不到最終的解。但是遞歸樹的方法給我們一種更好使用的解決辦法。下面根據一個簡單的例子說明這一點:

a=b=2f(n)=nlgn時候(lgn:log2n的簡記),計算遞歸方程的解。

T(n)= 2T(n/2)+nlgn

       T(n/b)= 2T(n/22)+(n/2)lg(n/2)

       T((n/b2)= 2T(n/23)+ (n/22)lg(n/22)

       ……

       於是得到:T(n)= nlgn+(nlgn-lg2)+ (nlgn-2lg2)+ (nlgn-22lg2)+···+(nlgn-2hlg2)h=lgn

       根據等差、等比數列求和公式化簡有:

       T(n)=n(lgn)2 –(n-1)lg2,所以T(n)= O( n(lgn)2),而不是O( nlgn)

       通過這個例子可以看出,當f(n)不是多項式的時候計算就有可能變得比較復雜,甚至無法計算。但是通過Master定理以及具體的數學變換技巧在某些情況下還是可行的。

       綜上所述,可以得出以下結論:在針對形如T(n)=aT(n/b)+f(n)的遞歸方程求解方法里,使用遞歸樹是一種比較可行的通用辦法。


免責聲明!

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



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