以前看數據結構與算法分析(C語言描述),作者在講述算法分析時提到遞歸計算斐波那契數列,
Fib(int N)
{
if(N <= 1)
return 1;
else
return Fib(N - 1) + Fib(N-2);
}
時間復雜度T(N) = T(N-1) + T(N-2);
作者說歸納法易證得T(N) >= Fib(N);而Fib(N) < (5/3)^(N);類似計算可正得Fib(N)>= (3/2)^(N)
這個地方作者處理得有些不太徹底,不是嗎?翻來覆去沒把Fib(N)准確求出,今天我翻看另一本資料,
更模糊了,它求得2^(N/2) < T(N) < 2^(N)就完事了。
不過今天我開竅了,T(N) = T(N-1) + T(N-2);這是什么?也許你會說這是一個遞推式,但它的學名是
二階齊次差分方程,我今天猛然看出這一點:)!
什么是差分方程?
以下資料全部來自Introduction to Numerical Analysis,second Edition Translate by
Bartels,W.Gautsch and C.Witigall,Springer-Verlag,世界圖書出版公司,(英文版)
百度百科:
這是我大三所用的數值分析教材,目前國內好像還沒中文版。
書上464頁說道:
By a linear homogeneous difference equation of order r one means an equation of the form
u(j+r) + a(r-1)u(j+4-1) + .... + a(0)u(j) =0; j=0,1,2... (7.2.9.1)
上面那些括號里的數一般是下標,我不好打出來,用括號代替了。
反正就是說齊次差分方程就是那個式子的形式了。
接着466頁上講到
Theorem. let the polynomial
Ψ(u) = u^r + a(r-1)u^(r-1) + ... + a(0)
have the k distinct zeros λ(i) ,i = 1,2,...,k
with multiplicities σ(i),i = 1,2,...,k
and let a(0) != 0,then for arbitray polynomials p(i)(t) with deg p(i) < σ(i),i = 1...k;
the sequence
u(j) = p(1)(j)λ(1)^(j) + p(2)(j)λ(2)^(j) +...+ p(k)(j)λ(k)^(j)
is a solution of the difference eqution (7.2.9.1).Conversely,every solution of
(7.2.9.1)can be uniquely represented in the form(7.2.9.9).
這段話又是什么意思呢?一句話:這是個牛逼的定理它導出了齊次差分方程的解並且說明了齊次差分方程
的所有解的形式。書上證明不是太短。
接下來舉例說明。就拿斐波那契數列來說。
書上561頁提了個問題,問題我就不打了,它問:
u(j+2) = u(j+1) + u(j)的通項公式是什么?然后它說u(0) = 0,u(1) = 1 即可得Fibonacci sequence
就是說這個式子從u(0) = 0,u(1) = 1遞推即可得斐波那契數列。從其他初始狀態的話可得其他數列。
開始解決問題。
按照那個牛逼定理,先解方程x^2 - x - 1 = 0;
這個不難,x1= (1+5^(1/2))/2,x2 = (1-5^(1/2))/2;
然后套公式u(j) = c1 * x1^(j) + c2 * x2^(j);
c1,c2為待定常數,利用u(0) = 0,u(1) = 1,得出c1 = 1/(5^(1/2));c2 = -c1;
這樣斐波那契數列的通項就出來了,遞歸計算斐波那契數列時間復雜度問題也就迎刃而解了。