斐波那契數列的時間複雜度詳釋與改進方法

2021-07-15 18:52:15 字數 4003 閱讀 6866

二階常係數線性差分方程的一般形式為: yn

+2+a

yn+1

+byn

=f(n

),n=

0,1,

2,..

..(1

−1)

其中a,

b為已知

常數,且

b≠0,

f(n)

為已知函

數。 方

程(1−

1)的對

應齊次方

程為:

yn+2

+ayn

+1+b

yn=0................................(1

−2)

設yn=

λn為方

程(1−

2)的特

解,其中

λ為非零

待定係數

,代入方

程後,有

λn(λ2+a

λ+b)

=0 因

λ≠0,

故函式y

n=λn

是方程(

1−2)

的特解的

充分必要

條件是λ

滿足方程

λ2+aλ+b

=0............................................(1

−3)

方程(1-3)成為方程(1-1)或(1-2)的特徵方程,特徵方程的解稱為特徵根或特徵值。

根據二次代數方程(1-3)解的三種情況,可以仿照二階常係數齊次線性微分方程,分別給出方程(1-1)的通解。

1.1特徵方程有兩個相異實根 即當

判別式δ

=a2−

4b>0時

,方程(

1−2)

有兩個相

異實根

λ1=1

2(−a

−δ−−

√),λ

2=12

(−a+

δ−−√

)...

.(1−

4)於是方程(1-2)有兩個特解 yn

1=λn

1,yn

2=λn

2 且由

yn1y

n2=(

λ1λ2

)n≠常

數,知y

n1與y

n2線性

無關,從

而得到方

程(1−

2)的通

解 yn

=c1λ

n1+c

2λn2

,其中λ

1,λ2

由式(1

−4)給

出,c1

,c2為

任意常數

。 1.2特徵方程有二重根 即當

判別式δ

=a2−

4b=0

時,方程

(1−3

)有二重

根λ1=

λ2=−

12a,

於是方程

(1−2

)有乙個

特解yn

1=(−

12a)

n,可驗

證方程(

1−2)

有另一特

解yn2

=n(−

12a)

n (注:係數n可參照二階常係數線性齊次微分方程的通項證明求得) 且由

yn1y

n2=1

n≠常數

,知yn

1與yn

2線性無

關,從而

得到方程

(10−2

)的通解

yn=(c1+

c2n)

(−12

a)n,

其中c1

,c2為

任意常數

。 1.3特徵方程有兩個共軛復根 即當

判別式δ

=a2−

4b<0時

,方程(

1−3)

有兩個共

軛復根

λ1=1

2(−a

+i−δ

−−−√

),λ2

=12(

−a−i

−δ−−

−√)

通過直接驗證可知,方程(1-2)有兩個特解 yn

1=rn

cosβ

n,yn

2=rn

sinβ

n 其中

r=(−

a2)2

+(−δ

√2)2

−−−−

−−−−

−−−−

−−√=

b√..

....

..(詳

見其他參

考)

遞推式:yn+

2=⎧⎩

⎨0,1

,yn+

1+yn

,n=0

n=1…

…..(

1−5)

n>1

由式(1

−2)可

知,yn

+2−y

n+1−

yn=0............(1

−6)

其中a=-1,b=-1 令y

n=λn

,式(1

−6)化

成λn(

λ2−λ

−1)=

0,解得

yn=c1(1

+5√2

)n+c

2(1−

5√2)

n,由y

0=0,

y1=1

可知 c

1=15

√,c2

=−15

√ yn

=15√

(1+5

√2)n

−15√

(1−5

√2)n

即為通解

可知,時間複雜度為指數形式。

1.時間複雜度為o(n)的方法:

int fibonacci(int n) 

if (n==1)

intmin=0;

intmax=1;

int i=2;

int result=0;

while (i<=n)

return result;

2.時間複雜度為o(logn)的方法:

根據式(1-5),可以化成矩陣的形式: (y

n+2y

n+1)

=(11

10)(

yn+1

yn)=

…=(1

110)

n+1(

y1y0

) 因而

計算yn

就簡化為

計算矩陣

的(n+

1)次方

,再對矩

陣分解,

計算矩陣

(n−2

)/2次

方的平方

,逐步分

解,因而

時間複雜

度為o(

logn

)

#include 

using

namespace

std;

class matrix

n=num;

clear();

}void clear()}}

void unit()

}matrix operator=(const matrix mtx)

matrix operator*(const matrix &mtx)

};int main(int argc, const

char * argv)

first=first*first;

n=n/2;

}cout

<<(result.m[0][0]+result.m[0][1])0;}

斐波那契數列時間複雜度

1.時間複雜度 o 2 n 空間複雜度 o n def fib n if n 3 return 1return f n 1 f n 2 推導 時間複雜度 f n f n 1 f n 2 每一層都包含乙個加法操作 例如n 8時,t n 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 1...

斐波那契數與時間複雜度

斐波那契數列 經典數學問題之一 斐波那契數列,又稱 分割數列,指的是這樣乙個數列 1 1 2 3 5 8 13 21 第一項,第二項的值為1,第三項開始,它的值為前兩項之和。實現非常簡單 簡單的看看這個圖,分析一下,根據fab 1 n 1 fab 1 n 2 如果想要得到斐波那契其數的第五項,首先要...

演算法入門 斐波那契數列和演算法的時間複雜度

此處使用三種方式實現斐波那契數列 遞迴 遞推和通項公式。實現過程如下 include include include includeusing namespace std 遞迴 int recurrence1 int n 遞推 int recurrence2 int n 通項公式 得到的值都是整數 ...