分治策略(求解遞歸式的方法)


分解:將原問題划分成形式相同的子問題,規模可以不等,對半或2/3對1/3的划分。

解決:對於子問題的解決,很明顯,采用的是遞歸求解的方式,如果子問題足夠小了,就停止遞歸,直接求解。

合並:將子問題的解合並成原問題的解。

  這里引出了一個如何求解子問題的問題,顯然是采用遞歸調用棧的方式。因此,遞歸式與分治法是緊密相連的,使用遞歸式可以很自然地刻畫分治法的運行時間。所以,如果你要問我分治與遞歸的關系,我會這樣回答:分治依托於遞歸,分治是一種思想,而遞歸是一種手段,遞歸式可以刻畫分治算法的時間復雜度

 

解遞歸式:

這里有三種方法:代入法、遞歸樹法和主方法。(下面這一部分結合有些網友的總結和我的總結得來)

代入法:

定義:先猜測某個界的存在,再用數學歸納法去證明該猜測的正確性。 
缺點:只能用於解的形式很容易猜的情形。 
總結:這種方法需要經驗的積累,可以通過轉換為先前見過的類似遞歸式來求解。

遞歸樹法:

起因:代換法有時很難得到一個正確的好的猜測值。 
用途:畫出一個遞歸樹是一種得到好猜測的直接方法。 
分析(重點):在遞歸樹中,每一個結點都代表遞歸函數調用集合中一個子問題的代價。將遞歸樹中每一層內的代價相加得到一個每層代價的集合,再將每層的代價相加得到遞歸式所有層次的總代價。 
總結:遞歸樹最適合用來產生好的猜測,然后用代換法加以驗證。 
遞歸樹的方法非常直觀,總的代價就是把所有層次的代價相加起來得到。但是分析這個總代價的規模卻不是件很容易的事情,有時需要用到很多數學的知識。

主方法:

主方法是最好用的方法,書本上以”菜譜“來描述這種方法的好用之處,它可以瞬間估計一個遞推式的算法復雜度。但是我們知道,這后面肯定是嚴格的數學證明在支撐着,對於我們用戶來說,我們只用知道怎么用就行了。

優點:針對形如T(n) = af(n/b) + f(n)的遞歸式

缺點:並不能解所有上述形式的遞歸式,有一些特殊情況,見下文分析。

分析:三種情況,如下圖,着重看圈線的部分:

直覺:看 f(n) 和 nlogb的關系,誰大取誰,相等則兩個相乘,但要注意看是否相差因子 nε。對於3),還要看是否滿足條件 af(n/b) <= cf(n) .

就像上面所說的,該方法不能用於所有的形如上式的遞歸式,f(n)和nlogba的關系必須是多項式意義上的小於大於,即漸近關系(漸近小於、漸近大於),什么是漸近,就是兩者相差一個因子nε。所以,在情況1和情況2之間有一定的間隙,同樣情況2和請看3之間也有一定的間隙;對於情況3,還要看是否滿足正則條件。

  

例子:

代入法:(憑直覺、經驗)

1)、習題4.3-1:T(n) = T(n-1) + n

2)、習題4.3-2:T(n) = T(n/2) + 1

遞歸樹法:

1)、對遞歸式T(n) = 3T(n/2) +n,利用遞歸樹確定一個好的漸近上界,用代入法進行驗證。

2)、對遞歸式T(n) = T(n/2) + n2,利用遞歸樹確定一個好的漸近上界,用代入法進行驗證。

主方法:

1)、對於下列遞歸式,使用主方法求出漸近緊確界。

  a、T(n) = 2T(n/4) + 1

  b、T(n) = 2T(n/4) + n1/2

  c、T(n) = 2T(n/4) + n

  d、T(n) = 2T(n/4) + n2


免責聲明!

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



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