【算法導論-主定理】用主方法求解遞歸式 學練結合版

問題:若某算法的計算時間表示爲遞推關係式:T(N)=2T(N/2)+NlogN 且 T(1)=1

則該算法的時間複雜度爲( )。
O(Nsqrt(N))
O(NlogN)
O(N(logN)^2)
O(N^2logN)
O(N^2)

解析:

應該是 O(N(logN)^2)
參考網址:主定理和《算法導論》
在這裏插入圖片描述
但是博主說其實你不會主定理也沒事兒,只要能找幾個特殊值帶入,並根據符號O的意義排除選項即可。所以……其實可以投機取巧。(望天)
主定理在《算法導論》的第53頁時間複雜度章節有講到(是的,黑色的很厚的那本)
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
對於三種情況的每一種,我們將函數f(n)與函數nlogban^{log_ba}進行比較。 直覺上, 兩個函數較大者決定了遞歸式的解。若函數nlogban^{log_ba}更大,如情況1,則解爲T(n)=Θ(nlogba)T(n)=Θ(n^{log_ba})。若函數f(n)更大,如情況3,則解爲T(n)=Θ(f(n))T(n)=Θ(f(n))。若兩個函數大小相當, 如情況2,則乘上一個對數因子,解爲T(n)=Θ(nlogbalgn)=Θ(f(n)lgn)T(n)= Θ(n^{log_ba}lgn) = Θ(f(n)lgn)。
注意, 這三種情況並未覆蓋f(n)的所有可能性。情況1和情況2之間有一定間隙,f(n)可能小於nlogban^{log_ba}但不是多項式意義上的小於。 類似地,情況2和情況3之間也有一定間隙 ,f(n)可能大於nlogban^{log_ba}.但不是多項式意義上的大於。如果函數f(n)落在這兩個間隙中,或者情況3中要求的正則條件不成立,就不能使用主方法來求解遞歸式。
在第一種情況中,不是 f(n)小於nlogban^{log_ba}就夠了,
而是要多項式意義上的小於。 也就是說,f(n)必須漸近小於nlogban^{log_ba},要相差一個因子nϵn^ϵ,其中ϵ是大於0的常數。 在第三種情況中,不是f(n)大於nlogban^{log_ba}就夠了,而是要多項式意義上的大於,而且還要滿足“正則”條件af(n/b)cf(n)af(n/b)\leq cf(n)。我們將會遇到的多項式界的函數中, 多數都滿足此條件。
假設我們有遞推關係式:
在這裏插入圖片描述
根據這個題,T(N)=2T(N/2)+NlogNT(1)=1T(N)=2T(N/2)+NlogN 且 T(1)=1,可知 a=2b=2f(n)=NlogNa=2,b=2,f(n)=NlogN,所以將函數f(n)=NlogNf(n)=NlogN與函數Nlog22logN=NlogNN^{log_22}logN=NlogN進行比較,他們複雜度相近,是情況2。從而根據公式:
f(n)=Θ(nlogbalogkn)T(n)=Θ(nlogbalogk+1n) f(n)=Θ(n^{log_ba}log_kn) ,則T(n)=Θ(n^{log_ba}log^{k+1}n)。
有:
Γ(n)=nlog22(log2n)=n(logn)2 \Gamma(n) = n^{log_22}*(log^2n)\,= n(logn)^2

類題試解:
1.二叉樹的遍歷:T(n)=2T(n2)+Θ(1)T(n)=2T(\frac{n}{2})+Θ(1)

可知a=2b=2f(n)=1a=2,b=2,f(n)=1, nlog22=nn^{log_22}=nf(n)=Θ(1)f(n)=Θ(1)大,是情況1,則根據公式,解爲T(n)=Θ(nlog22)=Θ(n)T(n)=Θ(n^{log_22})=Θ(n)

2.二分搜索(折半搜索)T(n)=T(n2)+Θ(1)T(n)=T(\frac{n}{2})+Θ(1)

可知a=1,b=2,f(n)=Θ(1),
nlog21=n0=1n^{log_21}=n^0=1,故f(n)和O(1)複雜度相近,是情況2,
根據公式,T(n)=lgnT(n)=lgn

3.最大子數組問題和歸併排序的分治算法的運行時間:T(n)=2T(n2)+Θ(n)T(n)=2T(\frac{n}{2})+Θ(n)

可知a=2,b=2,f(n)=Θ(n)f(n)=Θ(n)
nlog22=nn^{log_22}=nf(n)=Θ(n)f(n)=Θ(n)相近,是情況2,
根據公式,T(n)=Θ(nlogbalgn)=Θ(f(n)lgn)T(n)= Θ(n^{log_ba}lgn) = Θ(f(n)lgn)。
可得T(n)=Θ(nlog22lgn)=Θ(nlog2n)T(n)= Θ(n^{log_22}lgn) = Θ(nlog_2n)。

4.遞歸式T(n)=3T(n/4)+nlgnT(n) = 3T(n/4) +nlgn

我們有a=3,b=4,f(n)=nlgna=3,b=4, f(n)=nlgn,而nlog43=O(n0.793)n^{log_43}=O(n^{0.793})
由於f(n)=Ω(nlog43+ϵ)=Ω(n0.793+ϵ)f(n)=\Omega(n^{log_43+ϵ})=\Omega(n^{0.793+ϵ}),其中ϵ10.793=0.2ϵ\approx1-0.793=0.2f(n)=nlgn>nlog43f(n)=nlgn>n^{log_43}滿足情況3。且對常數c=0.75和所有足夠大的n有3(n/4)lg(n/4)0.75nlgn=cf(n)3(n/4)lg(n/4)\leq 0.75nlgn=cf(n)
故解爲T(n)=Θ(nlgn)T(n)= Θ(nlgn)

5.矩陣乘法問題第一個分治算法T(n)=8T(n2)+Θ(n2)T(n)=8T(\frac{n}{2})+Θ(n^2)

a=8,b=2,f(n)=n2a=8,b=2,f(n)=n^2,nlog28=n3n^{log_28}=n^3可以看出f(n)=n2<n3f(n)=n^2<n^3,應該是情況1,其中ϵ=1ϵ=1
T(n)=Θ(n3)T(n)= Θ(n^3)

6.Strassen算法的運行時間T(n)=7T(n/2)+Θ(n2)T(n) = 7T(n/2) +Θ(n^2)

有a=7,b=2,nlog27n2.805>n2,f(n)<n2.805n^{log_27}\approx n^{2.805}>n^2,故f(n)<n^{2.805},應用情況1公式:
T(n)=Θ(nlog27)T(n)= Θ(n^{log_27})
改寫底爲lg7lg7
在這裏插入圖片描述
log27=lg7lg2=0.840.3=2.807log_27=\frac{lg7}{lg2}=\frac{0.84}{0.3}=2.807
算法導論中的lg以2爲底
T(n)=Θ(nlg7)=Θ(n2.807)T(n)= Θ(n^{lg7})=Θ(n^{2.807})

不能使用主定理的情況:T(n)=2T(n/2)+Θ(nlgn)T(n) = 2T(n/2) +Θ(nlgn)

其中a=2b=2f(n)=nlgna=2,b=2,f(n)=nlgn
log22=nlog_22=nf(n)=nlgnf(n)=nlgn漸進大於n,而不是多項式大於n
多項式意義上的大於,顧名思義,就是兩個函數的商大於一個多項式。嚴格表述爲如下形式:當我們說f(x)多項式意義上大於g(x)時,我們是指:存在實數e>0,使得f(x)>g(x)*n^e。)
在這裏插入圖片描述
因此, 遞歸式落入了情況2和情況3之間的間隙,不可以使用主定理。
不過可以利用公式:
f(n)=Θ(nlogbalogkn)T(n)=Θ(nlogbalogk+1n) f(n)=Θ(n^{log_ba}log_kn) ,則T(n)=Θ(n^{log_ba}log^{k+1}n)。
根據算法導論P73的上下界取整:
在這裏插入圖片描述
可知O(Nlog22N)O(Nlog^2_2N)是T(n)的上界(O(N3)O(N^3)也是上界,但是不是緊確界)

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