1. 程式人生 > >斐波那契數列兩種演算法的時間複雜度

斐波那契數列兩種演算法的時間複雜度

斐波那契數列簡介:

斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……在數學上,斐波納契數列以如下被以遞推的方法定義:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在現代物理、準晶體結構、化學等領域,斐波納契數列都有直接的應用,為此,美國數學會從1963年起出版了以《斐波納契數列季刊》為名的一份數學雜誌,用於專門刊載這方面的研究成果。(摘自百度百科)

求F(n)一直是經典的面試題目,該問題程式設計實現的演算法有兩種,一種是遞迴演算法,一種非遞迴演算法。

1、遞迴演算法,先來看一下Java實現程式碼:

public int getFibonacciNumber(int n)
	{
		if(n == 1 || n == 2)
		{
			return 1;
		}else{
			return getFibonacciNumber(n-1)+getFibonacciNumber(n-2);
		}
	}

我們來分析一下遞迴演算法的時間複雜度,記計算第n個數的所需時間為T(n),那麼T(n) = T(n-1) + T(n-2) ,由T(n-1) > T(n-2) 可以推出T(n) < 2T(n-1) < 2^2 * T(n-2)<2^(n-1)T(1),可以推出T(n)的時間複雜度為O(2^n)。

2、非遞迴演算法,先來看一下Java實現程式碼:

public int getFibonacciNumber(int n)
	{
		if(n == 1 || n == 2)
		{
			return 1;
		}else{
			int a = 1,b = 1,t;
			for(int i = 0;i < n-2;i++)
			{
				t = b;
				b += a;
				a = t;
			}
			return b;
		}
	}

非遞迴演算法用的是迴圈,至多進行n次迴圈計算即可,演算法時間複雜度為O(n)。

總結:斐波那契數列的非遞迴演算法之所以比遞迴演算法效率高,是因為非遞迴演算法保留了中間計算結果,而遞迴演算法沒有保留中間計算結果。