分治策略 求解遞迴式的方法

2022-07-25 19:57:13 字數 2262 閱讀 1811

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

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

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

這裡引出了乙個如何求解子問題的問題,顯然是採用遞迴呼叫棧的方式。因此,遞迴式與分治法是緊密相連的,使用遞迴式可以很自然地刻畫分治法的執行時間。所以,如果你要問我分治與遞迴的關係,我會這樣回答:分治依託於遞迴,分治是一種思想,而遞迴是一種手段,遞迴式可以刻畫分治演算法的時間複雜度

解遞迴式:

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

代入法:

定義:先猜測某個界的存在,再用數學歸納法去證明該猜測的正確性。 

缺點:只能用於解的形式很容易猜的情形。 

總結:這種方法需要經驗的積累,可以通過轉換為先前見過的類似遞迴式來求解。

遞迴樹法:

起因:代換法有時很難得到乙個正確的好的猜測值。 

用途:畫出乙個遞迴樹是一種得到好猜測的直接方法。 

分析(重點):在遞迴樹中,每乙個結點都代表遞迴函式呼叫集合中乙個子問題的代價。將遞迴樹中每一層內的代價相加得到乙個每層代價的集合,再將每層的代價相加得到遞迴式所有層次的總代價。 

總結:遞迴樹最適合用來產生好的猜測,然後用代換法加以驗證。 

遞迴樹的方法非常直觀,總的代價就是把所有層次的代價相加起來得到。但是分析這個總代價的規模卻不是件很容易的事情,有時需要用到很多數學的知識。

主方法:

主方法是最好用的方法,書本上以」菜譜「來描述這種方法的好用之處,它可以瞬間估計乙個遞推式的演算法複雜度。但是我們知道,這後面肯定是嚴格的數學證明在支撐著,對於我們使用者來說,我們只用知道怎麼用就行了。

優點:針對形如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)、對於下列遞迴式,使用主方法求出漸近緊確界。

主方法求解遞迴式

求解遞迴式的方法有akra bazzi方法和strassen方法等等,但是akra bazzi方法有點難用,但它可以求解那些子問題劃分不均衡的演算法的遞迴式。主方法很容易使用,但只能用於子問題規模相等的情況。這幾天看了點對遞迴式進行求解,稍微了解到可以通過主方法很快的把使用分治策略解決的問題的時間複...

遞迴與分治策略

1 全排列問題 設r n 是要進行排列的n個元素。集合x中元素的全排列記為perm x 求r n 的全排列perm r n 用遞迴演算法求解 1 找出遞迴子結構性質 即原問題的解包含了子問題的解,且子問題的描述與原問題相同。這就可以用子問題的解來構造原問題的解。設r i r n 這是乙個子問題。設 ...

遞迴與分治策略

1.遞迴 直接或間接地呼叫自身的演算法稱為遞迴演算法。用函式自身給出定義的函式稱為遞迴函式。1 階乘函式 include using namespace std int main int factorial int n 2 fibonacci數列 include using namespace st...