以前只知道使用遞迴或遞推的方法,最近在csdn論壇上學到一種新的解法,在自己所知的幾個演算法裡,它具有最好的執行效率。這種方法使用下面這個關於fibonacci數的矩陣恒等式:
這個演算法就是根據這個恒等式,通過計算等式右邊的那個矩陣的n次方來計算第n個fibonacci數。n次方的計算使用快速模冪演算法,這樣計算n次方只用做log(n)次2*2矩陣的乘法,而每次乘法的計算時間是常量。所以,上述方法計算第n個fibonacci數的時間複雜度是o(log(n))。相比之下,用遞迴來計算第n個fibonacci的時間複雜度是o(fn),是指數時間複雜度的。用遞推來計算,是o(n),然而當n很大時,n之於log(n),等於無窮大之於無窮小。
順便把關於fibonacci的常用等式再總結一下:
計算fibonacci數(多種方法)
include using namespace std 計算fibonacci數 方法一 二分遞迴法,時間複雜度為o 2 n 額外空間複雜度為常數 int recursivefibonacci int n 方法二 線性遞迴,時間複雜度為o n 空間複雜度為o n int linearrecursio...
更高效的Fibonacci求解
兩種思想三種方式實現斐波那序列求解,一種是傳統遞迴的思想,一種是動態規劃的思想,動態規劃又分為top down和bottom up兩種方式。fast fibonacci.cpp 定義控制台應用程式的入口點。include stdafx.h include include support for cl...
更高效的Fibonacci求解
兩種思想三種方式實現斐波那序列求解,一種是傳統遞迴的思想,一種是動態規劃的思想,動態規劃又分為top down和bottom up兩種方式。fast fibonacci.cpp 定義控制台應用程式的入口點。include stdafx.h include include support for cl...