斐波那契高效演算法(4種演算法綜合分析)

2021-07-04 03:18:48 字數 1293 閱讀 1169

斐波那契數列問題是演算法學習者必然接觸到的問題,作為經典問題,首次接觸時一般是作為遞迴演算法的案例教程。

然而遞迴解決斐波那契,其效率低的令人髮指,有人算出其時間複雜度為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 ...