當子問題足夠大,需要遞迴求解時,稱之為遞迴情況。當子問題變得足夠小,不再需要遞迴時,我們說遞迴已經「觸底」,進入了基本情況。
遞迴式與分治方法是緊密相關的,因為使用遞迴式可以很自然的刻畫分治演算法的執行時間。乙個遞迴式就是乙個等式或不等式,它通過更小的輸入上的函式值來描述乙個函式。
子問題的規模不必是原問題規模的乙個固定比例。
求解遞迴式的方法:
世界中,我們會忽略遞迴式宣告和求解的一些技術細節。如果對 n
nn 個元素呼叫mergesort
,當 n
nn 為奇數時,兩個子問題的規模分別為 ⌊n/
2⌋
\lfloor n/2 \rfloor
⌊n/2
⌋ 和 ⌈n/
2⌉
\lceil n/2 \rceil
⌈n/2
⌉,準確來說都不是 n/2
n/2n/
2,因為當 n
nn 是奇數時, n/2
n/2n/
2 不是乙個整數。遞迴式為:
t (n
)=
\theta(1) & n = 1 \\ t(\lceil n/2 \rceil) + t(\lfloor n/2 \rfloor) + \theta(n) & n > 1 \end \right.
t(n)
= \theta(1) & n = 1 \\ 2t(n/2) + \theta(n) & n > 1 \end \right.
t(n)={
θ(1)
2t(n
/2)+
θ(n)
n=1
n>1
常被表示為:
t (n
)=2t
(n/2
)+θ(
n)
t(n) = 2t(n/2) + \theta(n)
t(n)=2
t(n/
2)+θ
(n)去掉了 n
nn 很小時函式值的顯式描述。原因在於,雖然改變 t(1
)t(1)
t(1)
的值會改變遞迴式的精確解,但改變幅度不會超過乙個常數因子,因而函式的增長階不會變化。
演算法導論 第四章 分治策略 速記
在分治策略中,我們遞迴的求解乙個問題,在每層遞迴中應用如下三個步驟 分解 divide 步驟將問題劃分為一些子問題 子問題的形式與原問題一樣,只是規模更小.解決 conquer 步驟遞迴地求解出子問題,如果子問題的規模足夠小,則停止遞迴,直接求解.合併 combine 步驟將子問題的解組合成原問題的...
第四章 分治法例題
給定由n個整數組成的序列 a1,a2,an 最大子段和問題要求該序列形如 的最大值 1 i j n 當序列中所有整數均為負整數時,其最大子段和為0。例如,序列 20,11,4,13,5,2 的 最大子段和為 a1,an的最大子段和 a1,a 的最大子段和 a1,an的最大子段和 a 1,an的最大子...
第四章 分治策略 最大子陣列問題
最大子陣列問題 方法一 暴力求解方法 我們可以很容易地設計出乙個暴力方法來求解本問題 簡單地嘗試沒對可能的子陣列,共有o n2 種 includeusing namespace std define int min 0x80000000 int main int i,j int sum 0,maxs...