算法設計關於遞歸方程T(n)=aT(n/b)+f(n)之通用解法
在算法設計中經常需要通過遞歸方程估計算法的時間復雜度T(n),本文針對形如T(n)=aT(n/b)+f(n)的遞歸方程進行討論,以期望找出通用的遞歸方程的求解方式。
算法設計教材中給出的Master定理可以解決該類方程的絕大多數情況,根據Master定理:o-漸進上界、w-漸進下界、O-漸進確界。
設a≥1,b>1為常數,f(n)為函數,T(n)=aT(n/b)+f(n)為非負數,令x=logba:
1. f(n)=o(nx-e),e>0,那么T(n)=O(nx)。
2. f(n)=O(nx),那么T(n)=O(nx logn)。
3. f(n)=w(nx+e),e>0且對於某個常數c<1和所有充分大的n有af(n/b)≤cf(n),那么T(n)=O(f(n))。
然而,Master定理並沒有完全包括所有的f(n)的情況。注意到條件1和3中的e總是大於0的,所以在條件1和2、條件2和3之間存在所謂的“間隙”,使得某些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),k≥0。根據遞歸樹計算方式,有:
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。
1:logba=k
這種情況下a/ bk= 1,顯然T(n)= O(nk logbn)。
2:logba≠k
此時等比數列公比不是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=2、f(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)的遞歸方程求解方法里,使用遞歸樹是一種比較可行的通用辦法。
