斐波那契數列問題是演算法學習者必然接觸到的問題,作為經典問題,首次接觸時一般是作為遞迴演算法的案例教程。
然而遞迴解決斐波那契,其效率低的令人髮指,有人算出其時間複雜度為o(2^n)。指數級時間複雜度。
如果面試的時候面試官問你斐波那契的求解方法,你來乙個遞迴求解,基本上可以說,你已經game over了。
那麼有沒有更高效的演算法呢,本文將一一介紹。
下面是斐波那契的4種解法:
1.遞迴 時間複雜度o(2^n)
int f(int n)
return f(n-1) + f(n-2);
}
2.迴圈 時間複雜度o(n)
public int f(int n)
return f2;
}
3.矩陣求解 時間複雜度o(logn)
斐波那契的遞推公式可以表示成如下矩陣形式,所以其
所以根據矩陣的分治演算法,可以在o(logn)時間內算出結果。
筆試問題:
對於斐波拉契經典問題,我們都非常熟悉,通過遞推公式f(n) = f(n - 1) + f(n - 2)n
項f(n),現在考慮斐波拉契的加強版,我們要求的項數
n的範圍為
int範圍內的非負整數,請設計乙個高效演算法,計算第n項
f(n)
。第乙個斐波拉契數為
f(0) = 1。
給定乙個非負整數,請返回斐波拉契數列的第
n項,為了防止溢位,請將結果
mod 1000000007。
long f = new long,};
public int getnthnumber1(int n)
private long pow(int n,long f)
if( n % 2 == 0)else
}private long fun(long f,long m)
4.公式求解 時間複雜度o(1)
對,你沒看錯,斐波那契數列是有求解公式的。其通項公式如下:
所以,任何斐波那契數都可以在o(1)時間內計算出來,但是有一點,因為牽涉到無理數,所以無法保證精度。
具體**略。
綜上,目前**效率最高也最準確的,是第3種矩陣求解方法,筆試面試時務必掌握。
【完】
斐波那契演算法
其思想與折半查詢 插值查詢沒有多大區別,本質上只是分割點的選擇不同。斐波那契查詢需要構造斐波那契數列,該數列的作用就是提供分割點 好多演算法書都沒有介紹清楚啊!參閱折半查詢 插值查詢以及斐波那契查詢 1 演算法首先找到構造乙個查詢表,即在原來的陣列上新增元素,使得該查詢表 陣列 的長度為某個斐波那契...
斐波那契查詢演算法
與二分查詢相比,斐波那契查詢演算法的明顯優點在於它只涉及加法和減法運算,而不用除法。因為除法比加減法要占去更多的機時,因此,斐波那契查詢的平均效能要比折半查詢好。include void fibonacci int f int fibonacci search int a,int key,int n...
演算法 斐波那契(1)
1.乙隻青蛙一次可以跳上一級台階,也可以跳上二級台階 為了跳上n級台階一共有幾種跳法 解析 1.n 1 1種 2.n 2 2種 3.n級台階可以由n 1或者n 2級台階跳上來f n f n 2 f n 1 include using namespace std int a 100 int jump ...