斐波那契查詢演算法

2021-09-25 02:46:21 字數 1323 閱讀 3586

斐波那契查詢原理與二分查詢或者插值查詢演算法類似,僅僅改變了中間結點(mid)的位置,mid 不再是中間或插值得到,而是位於**分割點附近,即 mid=low+f(k-1)-1(f 代表斐波那契數列),如下圖所示

由斐波那契數列 f[k]=f[k-1]+f[k-2] 的性質,可以得到 (f[k]-1)=(f[k-1]-1)+(f[k-2]-1)+1 。該式說明: 只要順序表的長度為 f[k]-1,則可以將該錶分成長度為 f[k-1]-1 和 f[k-2]-1 的兩段,即如上圖所示。從而中間

位置為 mid=low+f(k-1)-1

類似的,每一子段也可以用相同的方式分割

但順序表長度 n 不一定剛好等於 f[k]-1,所以需要將原來的順序表長度 n 增加至 f[k]-1。這裡的 k 值只要能使得 f[k]-1 恰好大於或等於 n 即可,由以下**得到,順序表長度增加後,新增的位置(從 n+1 到 f[k]-1 位置), 都賦為 n 位置的值即可。

while(n>fib(k)-1)

k++;

具體**如下:

// 因為後面我們mid=low+f(k-1)-1,需要使用到斐波那契數列,因此我們需要先獲取到乙個斐波那契數列

// 非遞迴方法得到乙個斐波那契數列

public static int fib()

return f;

} // 編寫斐波那契查詢演算法

// 使用非遞迴的方式編寫演算法

public static int fibsearch(int a, int key)

// 因為 f[k] 值 可能大於 a 的 長度,因此我們需要使用arrays類,構造乙個新的陣列,並指向temp

// 不足的部分會使用0填充

int temp = arrays.copyof(a, f[k]);

// 實際上需求使用a陣列最後的數填充 temp

// 舉例:

// temp = =>

for (int i = high + 1; i < temp.length; i++)

// 使用while來迴圈處理,找到我們的數 key

while (low <= high) else if (key > temp[mid]) else else

}} return -1;

}

斐波那契演算法的複雜度o(logn) 但是會比二分查詢快一點,因為二分查詢用的是除法,斐波那契用的是+-法,但是斐波那契需要額外的乙個陣列空

斐波那契查詢演算法

與二分查詢相比,斐波那契查詢演算法的明顯優點在於它只涉及加法和減法運算,而不用除法。因為除法比加減法要占去更多的機時,因此,斐波那契查詢的平均效能要比折半查詢好。include void fibonacci int f int fibonacci search int a,int key,int n...

斐波那契查詢演算法

斐波那契查詢的核心是 1 當key a mid 時,查詢成功 2 當keya mid 時,新的查詢範圍是第mid 1個到第high個,此時範圍個數為f k 2 1個,即陣列右邊的長度,所以要在 f k 2 1 範圍內查詢。如下 1 include2 include 3 include4 includ...

斐波那契查詢演算法

斐波那契查詢的核心是 1 當key a mid 時,查詢成功 2 當keya mid 時,新的查詢範圍是第mid 1個到第high個,此時範圍個數為f k 2 1個,即陣列右邊的長度,所以要在 f k 2 1 範圍內查詢。如下 1 include2 include 3 include4 includ...