遞迴演算法的時間複雜度分析

2021-07-26 15:31:51 字數 3874 閱讀 1179

這一段時間,我研究了一下演算法的時間複雜度分析,感覺其中的遞迴分析挺有意思,就總結一下記錄下來,以備以後隨時複習檢視。

下面假設遞迴方程式已經給出了,僅僅說明如何計算遞迴方程的時間複雜度。

對於遞迴方程的時間複雜度分析,需要分為兩個步驟,計算和證明

遇到乙個遞迴方程,首先看這個遞迴方程的形式,根據不同的形式又分為兩種不同的計算方法:

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 代入法的基本步驟是先推測遞迴方程的顯式解...