1. 步驟:
- 分解:將問題劃分為一些子問題,子問題的形式和原問題一樣,只是規模更小;
- 解決:遞歸的求解出子問題,如果子問題規模足夠小,則停止遞歸,直接求解;
- 合并: 將子問題的解組合成原問題的解;
2. 遞歸式
- 代入法:我們猜測一個界,然后用數學歸納法證明這個界是正確的
Ex:
T(n) = 4T(n/2) + n
--Guess: T(n) = O(n2)
--Assume :T(k)<=ck2 for k <n
--T(n) = 4T(n/2) + n<=4c(n/2)2+n = cn2+n
--Guess: T(n) = O(n2)
--Assume :T(k)<=c1k2-c2k for k <n
--T(n) = 4T(n/2) + n<=4c1(n/2)2-c2(n/2)+n=c1n2+(1-2c2)n=c1n2-c2n-(-1+c2)n need (-1+c2)>0則有c2>1
and T(1) <= c1-c2 so c1 > c2
-
遞歸樹法: 將遞歸式轉換為一棵樹,其結點表示不同層次的遞歸產生的代價,然后采用邊界和技術來解遞歸式
Ex: T(n)=T(n/4)+T(n/2)+n2
遞歸樹展開:
image.png
image.png
葉節點(即最后一層節點)數小于n,這個很容易理解,完全二叉樹的葉節點是n,這棵樹的遞歸速度更快,每一層的節點更少。
image.png
這是個幾何級數求和,即 1+5/16n2+25/256n2+...(5/16)(k次方)*n2
由 1+1/2+1/4...+1/n(k次方) <2得 上式<2n2。
- 主方法:可求解形如下面公式的遞歸式的界:
T(n) = aT(n/b) + f(n)
其中 a>= 1,b>1,f(n)是一個給定的函數。這種形式的遞歸式很常見,它刻畫了這樣一個分治算法:生成a個子問題,每個子問題的規模是原問題的規模的1/b,分解和合并步驟共花費的時間為f(n)。
有三種情況:
image.png