斐波那契查詢的
前提是待查詢的查詢表必須順序儲存並且有序。
相對於折半查詢,一般將待比較的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 範圍內查詢。與二分查詢相比,斐波那契查詢演算法 的明顯優點在...