Fibonacci数列时间复杂度之美妙
Fibonacci數(shù)列: fib(0)=1 fib(1)=1 fib(n)=fib(n-1)+fib(n-2)
?
上課老師出了一道題,求下列函數(shù)的時間復(fù)雜度:
int fib(int d) {if (d==0)return 0;if (d==1)return 1;return fib(d-1)+fib(d-2); }?
老師是這樣求的:
?
點(diǎn)的數(shù)目大約為滿(完全)二叉樹結(jié)點(diǎn)數(shù)目的一半,所以時間復(fù)雜度為O(2^n)。
但其實(shí)并不是這樣!
嚴(yán)謹(jǐn)上說,并不能證明出點(diǎn)的數(shù)目是x^n層面的,我們也可以認(rèn)為點(diǎn)的數(shù)目為nlogn級別,對吧?
從圖上看,樹的最低高度為n/2+1,只能說明點(diǎn)的數(shù)目至少為2^(n/2+1)而已。。。
?
fib(d)的計(jì)算步數(shù)為fib(d-1)的計(jì)算步數(shù)再加上fib(d-2)的計(jì)算步數(shù),
fib(d)終究是由若干個f(0)和f(1)組成,設(shè)由x個f(0)和y個f(1)組成,表示成(x,y),則:
fib(0): (1,0) fib(1):(0,1) fib(2):(1,1) fib(3):(1,2) …… fib(n):(fib(n-2),fib(n-1))
fib(n)的總操作步數(shù)為fib(n-2)+fib(n-1)=fib(n)=,
而(1-sqrt(5))/2相比(1+sqrt(5))/2較小,可以忽略不計(jì),所有其時間復(fù)雜度為1 / sqrt(5) * [(1+sqrt(5))/2]^n。
?
轉(zhuǎn)載于:https://www.cnblogs.com/cmyg/p/8653435.html
總結(jié)
以上是生活随笔為你收集整理的Fibonacci数列时间复杂度之美妙的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MongoDB Sharding分片配置
- 下一篇: L1-046. 整除光棍(模拟除法)