這一段時間,我研究了一下演算法的時間複雜度分析,感覺其中的遞迴分析挺有意思,就總結一下記錄下來,以備以後隨時複習檢視。
下面假設遞迴方程式已經給出了,僅僅說明如何計算遞迴方程的時間複雜度。
對於遞迴方程的時間複雜度分析,需要分為兩個步驟,計算和證明
遇到乙個遞迴方程,首先看這個遞迴方程的形式,根據不同的形式又分為兩種不同的計算方法:
1.形式如:t(
n)=a
t(nb
)+f(
n)的遞迴函式
對於形如t(
n)=a
t(nb
)+f(
n)的遞迴函式,我們可以使用下面的公式進行計算其時間複雜度: t(
n)=⎧
⎩⎨⎪⎪
o(nl
ogab
),o(
f(n)
×log
n),o
(f(n
),o(
nlog
ab)>o(
f(n)
)o(n
loga
b)=o
(f(n
))o(
nlog
ab)f(n)
) 注意:上面的公式中
a>1,
b>
1 均為正數,f(
n)為確定的正函式。
2.形式如:t(
n)=c
1t(n
−1)+
c2t(
n−2)
+⋯+c
kt(n
−k)+
f(n)
的遞迴函式
對於形如t(
n)=c
1t(n
−1)+
c2t(
n−2)
+⋯+c
kt(n
−k)+
f(n)
的遞迴函式,要求其中c1
,c2,
…,ck
≠0的常數,同時會有
k 個已知的等式e1
,e2,
…,ek
組成形如下面的遞迴函式: t(
n)=⎧
⎩⎨⎪⎪
⎪⎪⎪⎪
⎪⎪⎪⎪
e1,e
2,e3
,e4…
ek−1
ek,c
1t(n
−1)+
c2t(
n−2)
+⋯+c
kt(n
−k)+
f(n)
,n=0
n=1n
=2,3
…k−2
n=k−
1n>k−
1 首先從遞迴式 t(
n)=c
1t(n
−1)+
c2t(
n−2)
+⋯+c
kt(n
−k)+
f(n)
入手,將該遞迴式式移項得:t(
n)−c
1t(n
−1)−
c2t(
n−2)
−⋯−c
kt(n
−k)=
f(n)
然後寫出其對應的齊次方程,即根據含有t(
n),t
(n−1
),t(
n−2)
,…,t
(n−k
) 的個數減去1來確定方程未知數的最大次數為
k ,然後將方程中的t(
n)改為未知數的最大次數,t(
n−1)
改為未知數的第二大次數,以此類推,假設齊次方程的未知數是
t ,則結果如下式: tk
−c1t
k−1−
c2tk
−2−⋯
−ck=
f(n)
根據該方程的形式,可以知道如果該方程的某個解t=
r 是m 重根,則
m個解的形式是
,如果剩餘的解有多重跟也按照這種形式寫出即可,為了簡便,假設剩餘的解都為單根,則還剩(k
−m) 個解,其解的形式是
然後假設每個解的形式對應的係數分別為a1
,a2,
…,ak
,則可以寫出齊次方程的通解形式: a1
rn+a
2nrn
+a3n
2rn+
…+am
nm−1
rn+a
m+1r
n1+a
m+2r
n1+…
+akr
nk−m
為了求解通解中的未知係數a1
,a2,
…,ak
,需要先求的齊次方程的特解,下面給出特解形式**,為了簡便,令c(
t)=t
(n)−
c1t(
n−1)
−c2t
(n−2
)−⋯−
ckt(
n−k)
f(n) 形式
條件特解形式an
c(a)≠0
———————-
a 是c(
t)的m
重根p0
an———–p0
nman
nsc(
1)≠0
———————-
1 是c(
t)的m
重根p0
+p1n
+p2n
2+…+
psns
————————————————–nm
(p0+
p1n+
p2n2
+…+p
sns)
nsan
c(a)≠0
———————-
a 是c(
t)的m
重根(p
0+p1
n+p2
n2+…
+psn
s)an
—————————————————-nm
(p0+
p1n+
p2n2
+…+p
sns)
an常數無
常數x注意:這個**中需要求的未知數是:p0
,p1,
…,ps
,x,根據f(n
) 形式和條件在表中找到對應的特解形式———假設特解形式為
m ,令t(
n)=m
回代入到遞迴方程t(
n)=c
1t(n
−1)+
c2t(
n−2)
+⋯+c
kt(n
−k)+
f(n)
中,求出未知數p0
,p1,
…,ps
,x,將這些未知數代回特解中,即得到特解的確定形式,設其確定形式是
ζ ,則可以寫出其次方程的「通解+特解」形式: a1
rn+a
2nrn
+a3n
2rn+
…+am
nm−1
rn+a
m+1r
n1+a
m+2r
n1+…
+akr
nk−m
+ζ最後將遞迴方程的
k 個已知的等式e1
,e2,
…,ek
代入「通解+特解」形式,解出未知係數a1
,a2,
…,ak
,回代入「通解+特解」形式即得到最終解。
將第一步算出的時間複雜度帶入原來的遞迴方程,如果沒有出現矛盾,則是可能的解,最後用數學歸納法證明即可。
以後再加上……
references:
python27的部落格:
遞迴演算法時間複雜度分析
一般情況下,演算法中基本操作重複的次數就是問題規模n的某個函式f n 進而分析f n 隨n的變化情況並確定t n 的數量級。這裡用 o 來表示數量級,給出演算法時間複雜度。t n o f n 它表示隨問題規模n的增大,演算法的執行時間增長率和f n 增長率成正比,這稱作演算法的漸進時間複雜度。而我們...
遞迴演算法的時間複雜度分析
在演算法分析中,當乙個演算法中包含遞迴呼叫時,其時間複雜度的分析會轉化為乙個遞迴方程求解。實際上,這個問題是數學上求解漸近階的問題,而遞迴方程的形式多種多樣,其求解方法也是不一而足,比較常用的有以下四種方法 1 代入法 substitution method 代入法的基本步驟是先推測遞迴方程的顯式解...
遞迴演算法的時間複雜度分析
在演算法分析中,當乙個演算法中包含遞迴呼叫時,其時間複雜度的分析會轉化為乙個遞迴方程求解。實際上,這個問題是數學上求解漸近階的問題,而遞迴方程的形式多種多樣,其求解方法也是不一而足,比較常用的有以下四種方法 1 代入法 substitution method 代入法的基本步驟是先推測遞迴方程的顯式解...