算法導論第四章分治策略剖根問底(二)

   在上一篇中,經過一個求連續子數組的最大和的例子講解,想必咱們已經大概瞭然了分治策略和遞歸式的含義,可能會比較模糊,知道但不能用語言清晰地描述出來。但不要緊,我相信經過這篇博文,咱們會比較清楚且容易地用本身的話來描述。html

  經過前面兩章的學習,咱們已經接觸了兩個例子:歸併排序和子數組最大和。這兩個例子都用到了分治策略,經過分析,咱們能夠得出分治策略的思想:顧名思義,分治是將一個原始問題分解成多個子問題,而子問題的形式和原問題同樣,只是規模更小而已,經過子問題的求解,原問題也就天然出來了。總結一下,大體能夠分爲這樣的三步:算法

分解:將原問題劃分紅形式相同的子問題,規模能夠不等,對半或2/3對1/3的劃分。編程

解決:對於子問題的解決,很明顯,採用的是遞歸求解的方式,若是子問題足夠小了,就中止遞歸,直接求解。數組

合併:將子問題的解合併成原問題的解。網絡

  這裏引出了一個如何求解子問題的問題,顯然是採用遞歸調用棧的方式。所以,遞歸式與分治法是緊密相連的,使用遞歸式能夠很天然地刻畫分治法的運行時間。因此,若是你要問我分治與遞歸的關係,我會這樣回答:分治依託於遞歸,分治是一種思想,而遞歸是一種手段,遞歸式能夠刻畫分治算法的時間複雜度。因此就引入本章的重點:如何解遞歸式?函數

 

解遞歸式的三種方法工具

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

代入法:雲計算

定義:先猜想某個界的存在,再用數學概括法去證實該猜想的正確性。
缺點:只能用於解的形式很容易猜的情形。
總結:這種方法須要經驗的積累,能夠經過轉換爲先前見過的相似遞歸式來求解。
spa

遞歸樹法:

原由:代換法有時很可貴到一個正確的好的猜想值。
用途:畫出一個遞歸樹是一種獲得好猜想的直接方法。
分析(重點):在遞歸樹中,每個結點都表明遞歸函數調用集合中一個子問題的代價。將遞歸樹中每一層內的代價相加獲得一個每層代價的集合,再將每層的代價相加獲得遞歸式全部層次的總代價。
總結:遞歸樹最適合用來產生好的猜想,而後用代換法加以驗證。
遞歸樹的方法很是直觀,總的代價就是把全部層次的代價相加起來獲得。可是分析這個總代價的規模卻不是件很容易的事情,有時須要用到不少數學的知識。

主方法:

主方法是最好用的方法,書本上以」菜譜「來描述這種方法的好用之處,它能夠瞬間估計一個遞推式的算法複雜度。可是咱們知道,這後面確定是嚴格的數學證實在支撐着,對於咱們用戶來講,咱們只用知道怎麼用就好了。

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

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

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

直覺:看 f(n) 和 nlogba 的關係,誰大取誰,相等則兩個相乘,但要注意看是否相差因子 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

好了,以上只是熱身用的,關於更多的課後習題的解答,請詳見:http://www.cnblogs.com/Jiajun/archive/2013/05/08/3066979.html

 

 


個人公衆號 「Linux雲計算網絡」(id: cloud_dev),號內有 10T 書籍和視頻資源,後臺回覆 「1024」 便可領取,分享的內容包括但不限於 Linux、網絡、雲計算虛擬化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++編程技術等內容,歡迎你們關注。

相關文章
相關標籤/搜索