用遞歸樹方法求解遞歸式

用遞歸樹方法求解遞歸式

[備註:需要修改]
一個遞歸算法的遞歸式T(n)=3T(n/4)+cn2T\left(n\right)=3T\left(n/4\right)+cn^2

我們先來了解一下這個遞歸式什麼意思:

  • 33 表示我們將一個問題分解爲33個子問題;
  • n/4n/4 則表明每個子問題的規模是原問題的1/41/4
  • T()T\left(\right) 表明的爲遞歸形式;
  • cn2cn^2 表明爲合併需要的時間,其中cc爲常數係數c>0c>0。其實也就是算法度Θ(n2)Θ\left(n^2\right)

好的嘞~,現在來看遞歸樹:
在這裏插入圖片描述
我們可以從上圖中得出:

  • 該樹的長度爲:log4nlog_{4}n。理由爲:
        原本問題的規模爲nn,到了樹的最底層,則爲11了,也就是說,每往下一層,則規模爲1/41/4,我們假設它除去了ii44ii個結點),也就是說,n÷41÷42÷..÷4i=1n\div4_{1}\div4_{2}\div..\div4_{i}=1,換個思維,可以說是:4i=n4^i=n,換算一下也就是i=log4ni=log_{4}n

  • 每往下一層,其子問題得規模爲原問題1/41/4,也可以說是根據其結點,也就是結點每往下一層,其規模減少1/41/4,我們設置結點爲ii,就可以得到第ii層的規模將減少至原規模的14i\dfrac {1}{4^{i}},又因爲nn爲原規模,所以可以得出:
        當結點爲ii的時候,得出規模爲:n4i\dfrac {n}{4^{i}}

  • 每層的節點數都是上層的33倍,所以,當結點爲ii時,因此深度爲ii的結點數爲3i3^i

  • 我們可以看到遞歸樹的最上面那層,表示一開始的代價爲cn2cn^2,我們上面求出了結點爲ii的時候,規模爲:n4i\dfrac {n}{4^{i}},我現在將其轉爲代價,結點爲ii的時候,代價爲 c(n4i)2c\left(\dfrac {n}{4^{i}}\right)^2,我們需要把結點數也算上,結點爲ii時,有3i3^i個結點,最後乘起來,得到:
        3ic(n4i)2=(316)icn23^i\cdot c\left(\dfrac {n}{4^{i}}\right)^2=\left(\dfrac {3}{16}\right)^{i}cn^{2}

現在我們可以用級和去求總代價:

    T(n)=i=0log4n(316)icn2T\left(n\right)=\sum ^{log_{4}n}_{i=0}\left(\dfrac {3}{16}\right)^{i}cn^{2}  

       =cn2+(316)cn2+(316)2cn2+...+(316)log4n1cn2+(316)log4ncn2=cn^{2}+\left(\dfrac {3}{16}\right)^{}cn^{2}+\left(\dfrac {3}{16}\right)^{2}cn^{2}+...+\left(\dfrac {3}{16}\right)^{log_{4}n-1}cn^{2}+\left(\dfrac {3}{16}\right)^{log_{4}n}cn^{2}

    根據公式k=0nxk=xn+11x1\sum ^{n}_{k=0}x^{k}=\dfrac {x^{n+1}-1}{x-1}得出:

    (316)log4n+113161cn2\dfrac {\left(\dfrac {3}{16}\right)^{log_{4}n+1}-1}{\dfrac {3}{16}-1}\cdot cn^{2}

emmmmm,最後的結果好像有點凌亂…
沒事~,按照算法導論的思路,我們可以利用一定程度的不精確,將級和i=0log4n(316)icn2\sum ^{log_{4}n}_{i=0}\left(\dfrac {3}{16}\right)^{i}cn^{2}log4nlog_{4}n改爲,也就是無窮大。且i=0log4n(316)icn2<i=0(316)icn2\sum ^{log_{4}n}_{i=0}\left(\dfrac {3}{16}\right)^{i}cn^{2}<\sum ^{∞}_{i=0}\left(\dfrac {3}{16}\right)^{i}cn^{2}

    根據公式i=0xk=11x\sum ^{∞}_{i=0}x^{k}=\dfrac {1}{1-x}得出:

    11(316)cn2=(1613)cn2=Θ(n2)\dfrac {1}{1-\left(\dfrac {3}{16}\right)}\cdot cn^{2}=\left(\dfrac {16}{13}\right)cn^{2}=Θ(n^2)


 原本在算法導論上的算式應該是這樣寫的:

    T(n)=i=0log4n1(316)icn2+Θ(nlog43)T\left(n\right)=\sum ^{log_{4}n-1}_{i=0}\left(\dfrac {3}{16}\right)^{i}cn^{2}+Θ\left(n^{log_{4}3}\right)

       =cn2+(316)cn2+(316)2cn2+...+(316)log4n1cn2+Θ(nlog43)=cn^{2}+\left(\dfrac {3}{16}\right)^{}cn^{2}+\left(\dfrac {3}{16}\right)^{2}cn^{2}+...+\left(\dfrac {3}{16}\right)^{log_{4}n-1}cn^{2}+Θ\left(n^{log_{4}3}\right)

和我自己前面寫的的的表達式有些不同,其實就是把我級和的log4nlog4​n​減去11,然後把最後一項單獨拿出來寫,也就是(316)log4ncn2\left(\dfrac {3}{16}\right)^{log_{4}n}cn^{2},且經過轉化爲後,爲Θ(nlog43)Θ\left(n^{log_{4}3}\right)。也就是說,其實Θ(nlog43)Θ\left(n^{log_{4}3}\right)(316)log4ncn2\left(\dfrac {3}{16}\right)^{log_{4}n}cn^{2}是一樣的。

根據書上所說:
樹的最底層深度爲log4nlog_{4}n,有3log4n=nlog433^{log_{4}n}=n^{log_{4}3}個結點,每個結點的代價爲T(1)T\left(1\right),總代價爲nlog43T(1)n^{log_{4}3}T\left(1\right),即爲Θ(nlog43)Θ\left(n^{log_{4}3}\right)

中間將結點3log4n3^{log_{4}n}轉化爲nlog43n^{log_{4}3}算式如下:

    利用其公式alogaN=Na^{log_{a}N}=N得出:

    3=nlogn33=n^{log_{n}3}

    利用其公式logbN=logaNlogab=lgNlgblog_{b}N=\dfrac {log_{a}N}{log_{a}b}=\dfrac {lgN}{lgb}得出:

    3=nlogn3=nlg3/lgn3=n^{log_{n}3}=n^{lg3/lgn}

    將這個這個算式代入3log4n3^{log_{4}n}中去:

    3log4n=(nlg3/lgn)log4n3^{log_{4}n}=\left(n^{lg3/lgn}\right)^{log_{4}n}

    對括號外層的對數也利用其公式logbN=logaNlogab=lgNlgblog_{b}N=\dfrac {log_{a}N}{log_{a}b}=\dfrac {lgN}{lgb}得出:

    3log4n=(nlg3/lgn)log4n=(nlg3/lgn)lgn/lg43^{log_{4}n}=\left(n^{lg3/lgn}\right)^{log_{4}n}=\left(n^{lg3/lgn}\right)^{lgn/lg4}
                =nlg3/lgnlgn/lg4=n^{lg3/lgn\cdot lgn/lg4}
                =nlg3/lg4=n^{lg3/lg4}
                =nlog43=n^{log_{4}3}

就算是按照我的那個方式去寫,也無所謂,我們也可以直接將(316)log4ncn2\left(\dfrac {3}{16}\right)^{log_{4}n}cn^{2}轉換爲nlog43n^{log_{4}3}

    (316)log4ncn2=3log4n116log4ncn2=3log4n14log4n2cn2=3log4n1n2cn2=3log4n=nlog43\left(\dfrac {3}{16}\right)^{log_{4}n}cn^{2}=3^{log_{4}n}\cdot \dfrac {1}{16^{log_{4}n}}\cdot cn^{2}=3^{log_{4}n}\cdot \dfrac {1}{4^{log_{4}n\cdot 2}}\cdot cn^{2}=3^{log_{4}n}\cdot \dfrac {1}{n^{2}}\cdot cn^{2}=3^{log_{4}n}=n^{log_{4}3}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章