用遞歸樹方法求解遞歸式
[備註:需要修改]
一個遞歸算法的遞歸式:T(n)=3T(n/4)+cn2
我們先來了解一下這個遞歸式什麼意思:
- 3 表示我們將一個問題分解爲3個子問題;
- n/4 則表明每個子問題的規模是原問題的1/4;
- T() 表明的爲遞歸形式;
- cn2 表明爲合併需要的時間,其中c爲常數係數c>0。其實也就是算法度Θ(n2)。
好的嘞~,現在來看遞歸樹:
我們可以從上圖中得出:
-
該樹的長度爲:log4n。理由爲:
原本問題的規模爲n,到了樹的最底層,則爲1了,也就是說,每往下一層,則規模爲1/4,我們假設它除去了i個4(i個結點),也就是說,n÷41÷42÷..÷4i=1,換個思維,可以說是:4i=n,換算一下也就是i=log4n
-
每往下一層,其子問題得規模爲原問題1/4,也可以說是根據其結點,也就是結點每往下一層,其規模減少1/4,我們設置結點爲i,就可以得到第i層的規模將減少至原規模的4i1,又因爲n爲原規模,所以可以得出:
當結點爲i的時候,得出規模爲:4in
-
每層的節點數都是上層的3倍,所以,當結點爲i時,因此深度爲i的結點數爲3i
-
我們可以看到遞歸樹的最上面那層,表示一開始的代價爲cn2,我們上面求出了結點爲i的時候,規模爲:4in,我現在將其轉爲代價,結點爲i的時候,代價爲 c(4in)2,我們需要把結點數也算上,結點爲i時,有3i個結點,最後乘起來,得到:
3i⋅c(4in)2=(163)icn2
現在我們可以用級和去求總代價:
T(n)=∑i=0log4n(163)icn2 ①
=cn2+(163)cn2+(163)2cn2+...+(163)log4n−1cn2+(163)log4ncn2
根據公式∑k=0nxk=x−1xn+1−1得出:
163−1(163)log4n+1−1⋅cn2
emmmmm,最後的結果好像有點凌亂…
沒事~,按照算法導論的思路,我們可以利用一定程度的不精確,將級和∑i=0log4n(163)icn2的log4n改爲∞,也就是無窮大。且∑i=0log4n(163)icn2<∑i=0∞(163)icn2
根據公式∑i=0∞xk=1−x1得出:
1−(163)1⋅cn2=(1316)cn2=Θ(n2)
① 原本在算法導論上的算式應該是這樣寫的:
T(n)=∑i=0log4n−1(163)icn2+Θ(nlog43)
=cn2+(163)cn2+(163)2cn2+...+(163)log4n−1cn2+Θ(nlog43)
和我自己前面寫的的的表達式有些不同,其實就是把我級和的log4n減去1,然後把最後一項單獨拿出來寫,也就是(163)log4ncn2,且經過轉化爲後,爲Θ(nlog43)。也就是說,其實Θ(nlog43)和(163)log4ncn2是一樣的。
根據書上所說:
樹的最底層深度爲log4n,有3log4n=nlog43個結點,每個結點的代價爲T(1),總代價爲nlog43T(1),即爲Θ(nlog43)。
中間將結點3log4n轉化爲nlog43算式如下:
利用其公式alogaN=N得出:
3=nlogn3
利用其公式logbN=logablogaN=lgblgN得出:
3=nlogn3=nlg3/lgn
將這個這個算式代入3log4n中去:
3log4n=(nlg3/lgn)log4n
對括號外層的對數也利用其公式logbN=logablogaN=lgblgN得出:
3log4n=(nlg3/lgn)log4n=(nlg3/lgn)lgn/lg4
=nlg3/lgn⋅lgn/lg4
=nlg3/lg4
=nlog43
就算是按照我的那個方式去寫,也無所謂,我們也可以直接將(163)log4ncn2轉換爲nlog43:
(163)log4ncn2=3log4n⋅16log4n1⋅cn2=3log4n⋅4log4n⋅21⋅cn2=3log4n⋅n21⋅cn2=3log4n=nlog43