Resolving Recurrence
(1) – Substitution?Method
?
整個(gè)recurrence就是研究一個(gè)數(shù)學(xué)表達(dá)式:T(n) = aT(n/b)+f(n) ? 意思是先有一個(gè)問(wèn)題T(n), 解決思路為把T(n)切分成a個(gè)小問(wèn)題, 每個(gè)小問(wèn)題的代價(jià)是T(n/b), 然后把a(bǔ)個(gè)T(n/b)的結(jié)果合并起來(lái)的代價(jià)是f(n);依次類(lèi)推,直到T(k)的粒度小到其復(fù)雜度是一個(gè)常數(shù)。很像是遞歸吧~~遞歸只是一種實(shí)現(xiàn)方式,這里介紹的是一種思路和評(píng)估這種思路復(fù)雜度的方法。
經(jīng)典的評(píng)估Recurrence的方法有3種,Substitutuon, Recursion Tree和Master Method.? 看下面的命題:
T(n) = 4T(n/2) + n ,需要證明T(n)=O(n2 )
Substitution:
假設(shè)T(k) <= ck2? k<n; 所以 T(n) <= 4(n/2)2 +n = n2 +n 要證明n2 +n<=cn2 好像不容易。
我們換個(gè)假設(shè),假設(shè)T(k)<=c1 k2 -c2 k ,這樣的話(huà)T(n) <= c1 n2 -(2c2 -1)n = c1 n2 -c2 n-(c2 -1)n. 所以只要 c2 >= 1,就證明成功了。注意這里,似乎沒(méi)有對(duì)c1 任何限制。其實(shí)不是的!對(duì)于所有的induction方法來(lái)說(shuō),我們都需要一個(gè)初始條件,T(n0 ) = H(1) <=c1 n0 2 -c2 n0 這里我使用H(1) 代表常數(shù)復(fù)雜度。為了滿(mǎn)足初始條件,我們需要恰當(dāng)?shù)倪x擇 c1 ,c2 和n0 。
其實(shí)這里的初始條件就對(duì)應(yīng)了算法設(shè)計(jì)里面的Base Case。Base Case就是將問(wèn)題切分到最后那個(gè)粒度最小的復(fù)雜度為常數(shù)的Case。就上面的那個(gè)例子來(lái)說(shuō),c1 和c2 ,對(duì)運(yùn)行時(shí)起主導(dǎo)作用的是前者,你在實(shí)現(xiàn)時(shí)設(shè)計(jì)的Base Case能使c1 越小,程序運(yùn)行越快。
?
(2) – Recursion?Tree
?
T(n) = T(n/3) + T(2n/3) + n
Recursion Tree其實(shí)就是Iteration,只不過(guò)圖型化以后我們看起來(lái)更容易理解了。
T(n) = T(n/3) + T(2n/3) + n
?????? = [T(n/9) + T(2n/9) + n/3] + [T(2n/9) + T(4n/9) + 2n/3]
?????? = ……
畫(huà)成圖就是:
?
總的cost就是把每一層的cost加起來(lái)。層數(shù)就是樹(shù)的高度。上面的這個(gè)問(wèn)題有點(diǎn)tricky的。從圖上看分兩種情況,一種以1/3的方式減少n,還有一種是以2/3的方式。前一種方式經(jīng)過(guò)log3 n次就到達(dá)葉子節(jié)點(diǎn),后一種方式經(jīng)過(guò)log3/2 n次,因?yàn)閘og3/2 n > log3 n,樹(shù)的高度為log3/2 n。每一層加起來(lái)的代價(jià)是cn, 其實(shí)越到下面,每一層的cost會(huì)小于cn的,因?yàn)槟菚r(shí)候按照1/3的方式減少的那一枝已經(jīng)不存在了。
T(n) <= cn x log3/2 n = O(nlgn)
Recursion tree很直觀(guān),我們可以用它來(lái)幫助我們猜測(cè)規(guī)律,然后再用Substitution方法Double Confirm。
不過(guò)無(wú)論是Substitution還是Recursion Tree都比較煩,不能馬上得出結(jié)果。有人總結(jié)了規(guī)律,叫做Mater Method。使用Master Method, 我們很快就可以直接寫(xiě)出T(n)=aT(n/b)+f(n)的時(shí)間復(fù)雜度。
?
(3) – Master?Method
?
?
前面分別介紹了 Resolving Recurrence(1) – Substitution Method 和 Resolving Recurrence(2) – Recursion Tree 來(lái)評(píng)估
T(n) = aT(n/b) + f(n) 的時(shí)間復(fù)雜度。
這一節(jié)介紹Master Method,既然叫Master,可見(jiàn)其重要程度。掌握了Master Method,我們可以很快寫(xiě)出Merge Sort, Heap Sort以及Quick Sort的時(shí)間復(fù)雜度。
Master Method: ? (在 a>=1 并且 b>1 的情況下)
- 如果f(n) is polynomially smaller than nlog b a , polynomially smaller就是grow slower, 數(shù)學(xué)表達(dá)式f(n)=O(nlog b a-e ), e>0。 T(n) = O(nlog b a )
- 如果f(n) is polynomially same as nlog b a , T(n) = O(nlog b a lgn)
- 如果f(n) is polynomially faster than? nlog b a , 并且 af(n/b) <= cf(n),? c<1 && n>=b , T(n) = H(f(n)) . H表示復(fù)雜度相當(dāng)。
舉個(gè)例子T(n)=4T(n/2)+n , 其中a=4, b=2, –> nlog b a =? n2 , 而f(n)=n, 屬于第一種情況所以 T(n) = O(n2 )。 如果T(n)=2T(n/2)+n, 則屬于第二種情況,T(n) = O(n lgn).
在算法導(dǎo)論中有詳細(xì)的證明,太符號(hào)化的東西往往難以記憶,下面我們用recursion tree的方式,幫助理解和記憶。
可見(jiàn), 第一層有一個(gè)節(jié)點(diǎn),第二層有a的節(jié)點(diǎn),第 i 層有ai 個(gè)節(jié)點(diǎn),所以到葉子節(jié)點(diǎn)那層,葉子的個(gè)數(shù)就是 a的 樹(shù)高 次冪。而樹(shù)高=logb n , 我們可以很容易證明 alog b n = nlog b a 。所以一共有nlog b a 個(gè)葉子,每個(gè)葉子其實(shí)就是我們的initial condition,就是我們的base case,是整個(gè)算法的基石。
cost of all the leaves nodes = H(nlog b a )
現(xiàn)在對(duì)照recursion tree再來(lái)回顧一下Master Method 的 3 種情況:
1. 當(dāng)所有葉子的代價(jià)比根節(jié)點(diǎn)高時(shí), O(nlog b a ) > f(n), 從root到leaves,每層的cost在geometry increase,由葉子主導(dǎo)整個(gè)算法的時(shí)間復(fù)雜度,所以 T(n) = O(nlog b a )
2. 當(dāng)所有葉子的代價(jià)和根節(jié)點(diǎn)相當(dāng)時(shí),表示從root 到 leaves的每一層的cost 是 幾乎balance的,總代價(jià)應(yīng)該是 每一層代價(jià)乘以樹(shù)高, T(n) = nlog b a x logb n = H(f(n) x logb n = O(nlog b a lgn)。
3. 當(dāng)所有葉子的代價(jià)比根節(jié)點(diǎn)低時(shí),由根節(jié)點(diǎn)主導(dǎo)整個(gè)算法的時(shí)間復(fù)雜度。af(n/b) <= cf(n),? c<1 && n>=b 表示把任務(wù)T(n)切分成a個(gè)T(n/b)的過(guò)程中,必須保證a個(gè)T(n/b)的合并代價(jià)必須小于上層任務(wù)的合并代價(jià),并且每次切分,其單個(gè)節(jié)點(diǎn)的合并代價(jià)都是在減少的。簡(jiǎn)單來(lái)說(shuō)就是 從root 到leaves的過(guò)程中,代價(jià)是geometry decrease的。 結(jié)論是 T(n) = H(f(n))。
?
?
總結(jié)
以上是生活随笔為你收集整理的Resolving Recurrence的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 看2014视频三国杀
- 下一篇: essay 浅谈ACM盲区(下)