(1)t(n)不是單調函式,(e.g. t(n) = sinx)
(2)f(n)不是多項式函式 (e.g. t(n) = t(n/2) + 2n)
(3)b不能表示為乙個常量(e.g. t(n) = 2t(√n))
(1) t(n) = t(n/2) + 1/2 * n2 + n
解:此時 a = 1, b = 2, f(n) = 1/2*n2 + n
故 nlogba
= n0
= 1f(n) = ω(nlogba+2),ε=2,且當 c = 1/4時,滿足第三種情況的條件
故第三種情況成立,t(n) = θ(n2)
(2) t(n) = 2t(n/4) + √n + 42
解:此時 a = 2, b = 4, f(n) = √n + 42
故 nlogba = n1/2
所以 f(n) = θ(nlogba)
故第二種情況成立,t(n) = θ(nlogba*logn) = θ(√n*logn)
(3) t(n) = 3t(n/2) + 3/4*n + 1
解:此時 a = 3, b = 2, f(n) = 3/4*n + 1
故 nlogba = n
所以 f(n) = o(nlogba-(logba-1)),ε = logba-1 = log23-1 > 0,
故第一種情況成立,t(n) = θ(nlogba) = θ(nlog23)
遞迴樹是一棵結點帶權值的樹。初始的遞迴樹只有乙個結點,它的權標記為t(n);然後按照遞迴樹的迭代規則不斷進行迭代,每迭代一次遞迴樹就增加一層,直到樹中不再含有權值為函式的結點(即葉結點都為t(1)t(1))。下面以遞迴方程
為例講解遞迴樹。
首先這道題肯定是沒法用主定理,所以畫遞迴樹:
因為每次兩個分支大小不相同,故這顆樹實際上並不像畫出來這樣的平衡,故樹高度最高為log2n,最低為log4n
我們假設極限樹高為log2n,即最大高度,且為平衡樹,此時可以得到時間複雜度的上界:
同理當極限樹高為log4n時,得到時間複雜度的下界:
故可知時間複雜度為
t(n) = 2t(n-1) + 1(t(1) = 1)
這道題是不是看起來很像高中學的等比數列遞推式,是的!
如果方程右端出現t(n-1)這種式子,很有可能是遞推式,再觀察是等比還是等差數列,這道題很像等比,所以構造
at(n)+b = 2(t(n-1)+b)
再和原式比較,得a = 1, b = 1,也就是說 t(n) +1 = 2(t(n-1) + 1)
首項為t(1)+1 = 2,所以得通項公式為:
t(n) + 1 = 2*2n-1 = 2n
不過對於這類題還有一種更通用的公式很方便:
對於這道題來說,c=1,b=2,g(n)=1,代入方程得:
與前面做法得到得結果相同
主方法求解遞迴式
求解遞迴式的方法有akra bazzi方法和strassen方法等等,但是akra bazzi方法有點難用,但它可以求解那些子問題劃分不均衡的演算法的遞迴式。主方法很容易使用,但只能用於子問題規模相等的情況。這幾天看了點對遞迴式進行求解,稍微了解到可以通過主方法很快的把使用分治策略解決的問題的時間複...
主定理(主方法)求解遞迴式
用主方法求解遞迴式有條件,必須要求遞迴式為以下形式 其中a 1,b 1,f n 漸進趨正,意為對足夠大的n,f n 是正的,即n n 0n 0 n0 時,f n 0。其中 n為問題規模,a為遞推的子問題數量,n b 為每個子問題的規模 假設每個子問題的規模基本一樣 f n 為遞推以外進行的計算工作。...
分治策略 求解遞迴式的方法
分解 將原問題劃分成形式相同的子問題,規模可以不等,對半或2 3對1 3的劃分。解決 對於子問題的解決,很明顯,採用的是遞迴求解的方式,如果子問題足夠小了,就停止遞迴,直接求解。合併 將子問題的解合併成原問題的解。這裡引出了乙個如何求解子問題的問題,顯然是採用遞迴呼叫棧的方式。因此,遞迴式與分治法是...