斐波那契查詢

2021-09-20 09:52:59 字數 2218 閱讀 5670

實驗資料表明當資料量超過40萬時,斐波那契查詢演算法查詢速度優於二分查詢

原理:與二分查詢相比,斐波那契查詢的明顯優點在於它只涉及加法和減法運算,而不用除法(可能用「>>1」要好點)。因為除法比加減法要占去更多的機時,因此,斐波那契查詢的執行時間比二分查詢短。

但是,在命中率方面,二分查詢比斐波那契查詢出色

斐波那契演算法實現:

#include #include #define maxsize 13

void fibonacci(int *f)}

int fibonacci_search(int *a, int n, int key)

//問題二:

//這個地方,我發現被查詢的陣列a的長度不好計算,比如,我現在要查詢31在陣列a中的位置

//那麼,由於n = 13, 位於斐波那契數列中的第7個數(21)和第8個數(34)之間,所以k的

//值為7,f[k] - 1就等於20,那麼陣列a的長度就需要是a[20]。換個數又變了,我不知道這個

//應該怎麼控制?

for (int i = n; i < f[k] - 1; i++)

//問題三:

//還有這個判斷,當鍵值小於a[mid]時,就在[low, f[k - 1] - 1]範圍內查詢

//當鍵值大於a[mid]時,就在[f[k - 2] - 1]範圍內查詢,這個依據是什麼?

while(low <= high)

else if ( key > a[mid] )

else

else

return n;

} }return -1;}

解析:首先要明確:如果乙個有序表的元素個數為n,並且n正好是(某個斐波那契數 - 1),即n=f[k]-1時,才能用斐波那契查詢法。 如果有序表的元素個n不等於(某個斐波那契數 - 1),即n≠f[k]-1,這時必須要將有序表的元素擴充套件到大於n的那個斐波那契數 - 1才行,這段**:

for (int i = n; i < f[k] - 1; i++)

便是這個作用。

下面回答

第乙個問題:看完上面所述應該知道①是為什麼了吧。 查詢n在斐波那契數列中的位置,為什麼是f[k] - 1,而不是f[k],是因為能否用斐波那契查詢法是由f[k]-1決定的,而不是f[k]。如果暫時不理解,繼續看下面。

第 二個問題:a的長度其實很好估算,比如你定義了有10個元素的有序陣列a[20],n=10,那麼n就位於8和13,即f[6]和f[7]之間,所以 k=7,此時陣列a的元素個數要被擴充,為:f[7] - 1 = 12個; 再如你定義了乙個b[20],且b有12個元素,即n=12,那麼很好辦了,n = f[7]-1 = 12, 用不著擴充了; 又或者n=8或9或11,則它一定會被擴充到12; 再如你舉的例子,n=13,最後得出n位於13和21,即f[7]和f[8]之間,此時k=8,那麼f[8]-1 = 20,陣列a就要有20個元素了。 所以,n = x(13<=x<=20)時,最後都要被擴充到20;類推,如果n=25呢,則陣列a的元素個數肯定要被擴充到 34 - 1 = 33個(25位於21和34,即f[8]和f[9]之間,此時k=9,f[9]-1 = 33),所以,n = x(21<=x<=33)時,最後都要被擴充到33。也就是說,最後陣列的元素個數一定是(某個斐波那契數 - 1),這就是一開始說的n與f[k]-1的關係。

第三個問題:對於二分查詢,分割是從mid= (low+high)/2開始;而對於斐波那契查詢,分割是從mid = low + f[k-1] - 1開始的; 通過上面知道了,陣列a現在的元素個數為f[k]-1個,即陣列長為f[k]-1,mid把陣列分成了左右兩部分, 左邊的長度為:f[k-1] - 1, 那麼右邊的長度就為(陣列長-左邊的長度-1), 即:(f[k]-1) - (f[k-1] - 1) = f[k] - f[k-1] - 1 = f[k-2] - 1。

斐波那契查詢的核心是:

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

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

斐波那契查詢

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

斐波那契查詢

與二分查詢相比,斐波那契查詢演算法的明顯優點在於它只涉及加法和減法運算,而不用除法。因為除法比加減法要占去更多的機時,因此,斐波那契查詢的平均效能要比折半查詢好。斐波那契查詢與折半查詢的時間複雜度間同為o log2 log2n 平均 情況下,斐波那契查詢優於折半查詢,但最壞情況下則差於折半查詢。斐波...

斐波那契查詢

基於二分法 此演算法依靠斐波那契數列 來跳轉比較位置 在玩數字板所以有了手寫圖 單步驟原理如下 c語言實現 include include define return fail 1 斐波那契查詢 int fibonaccisearch int src int,int src len,int sear...