斐波那契查詢詳解

2021-06-16 13:28:52 字數 1831 閱讀 4072

斐波那契查詢的

前提是待查詢的查詢表必須順序儲存並且有序。

相對於折半查詢,一般將待比較的key值與第mid=(low+high)/2位置的元素比較,比較結果分三種情況

1)相等,mid位置的元素即為所求

2)>     ,low=mid+1;

3)  <     ,high=mid-1;

斐波那契查詢與折半查詢很相似,他是根據斐波那契序列的特點對有序表進行分割的。他要求開始表中記錄的個數為某個斐波那契數小1,及n=fk-1;

開始將k值與第f(k-1)位置的記錄進行比較(及mid=low+f(k-1)-1),比較結果也分為三種

1)相等,mid位置的元素即為所求

2)>   ,low=mid+1,k-=2;

說明:low=mid+1說明待查詢的元素在[mid+1,hign]範圍內,k-=2 說明範圍[mid+1,high]內的元素個數為n-(f(k-1))=

fk-1-f(k-1)=fk-f(k-1)-1=f(k-2)-1個,所以可以遞迴的應用

斐波那契查詢

3)<    ,high=mid-1,k-=1;

說明:low=mid+1說明待查詢的元素在[low,mid-1]範圍內,k-=1 說明範圍[low,mid-1]內的元素個數為f(k-1)-1

個,所以可以遞迴 的應用斐波那契查詢

斐波那契查詢的演算法如下:

// 斐波那契查詢.cpp

#include "stdafx.h"

#include #include using namespace std;

const int max_size=20;//斐波那契陣列的長度

/*構造乙個斐波那契陣列*/

void fibonacci(int * f)

else

} delete temp;

return -1;

}int _tmain(int argc, _tchar* argv)

; int key=100;

int index=fibonacci_search(a,sizeof(a)/sizeof(int),key);

cout<

斐波那契查詢的核心是:

1)當key=a[mid]時,查詢成功;

2)當keya[mid]時,新的查詢範圍是第mid+1個到第high個,此時範圍個數為f[k-2] - 1個,即陣列右邊的長度,所以要在[f[k - 2] - 1]範圍內查詢。

關於斐波那契查詢, 如果要查詢的記錄在右側,則左側的資料都不用再判斷了,不斷反覆進行下去,對處於當眾的大部分資料,其工作效率要高一些。所以儘管斐波那契查詢的時間複雜度也為o(logn),但就平均效能來說,斐波那契查詢要優於折半查詢。可惜如果是最壞的情況,比如這裡key=1,那麼始終都處於左側在查詢,則查詢效率低於折半查詢。

還有關鍵一點,折半查詢是進行加法與除法運算的(mid=(low+high)/2),插值查詢則進行更複雜的四則運算(mid = low + (high - low) * ((key - a[low]) / (a[high] - a[low]))),而斐波那契查詢只進行最簡單的加減法運算(mid = low + f[k-1] - 1),在海量資料的查詢過程中,這種細微的差別可能會影響最終的效率。

參考文獻:嚴蔚敏資料結構c語言版 221頁 及蘆葦csdn部落格  

斐波那契查詢(超詳解)

斐波那契查詢.cpp include include using namespace std const int max size 20 斐波那契陣列的長度 構造乙個斐波那契陣列 void fibonacci int f else 斐波那契查詢方法的核心 就是上面一段 原理 1 當key a mid...

斐波那契查詢(超詳解)

斐波那契查詢.cpp include include using namespace std const int max size 20 斐波那契陣列的長度 構造乙個斐波那契陣列 void fibonacci int f 定義斐波那契查詢法 int fibonacci search int a,in...

斐波那契查詢

斐波那契查詢 斐波那契查詢的核心是 1 當key a mid 時,查詢成功 2 當key 3 當key a mid 時,新的查詢範圍是第mid 1個到第high個,此時範圍個數為f k 2 1個,即陣列右邊的長度,所以要在 f k 2 1 範圍內查詢。與二分查詢相比,斐波那契查詢演算法 的明顯優點在...