查詢演算法 斐波那契查詢演算法實現及分析

2021-08-15 21:13:26 字數 1820 閱讀 5858

斐波那契查詢法肯定與斐波那契相關嘛,斐波那契數列 又稱**分割數列。所以我們先把**分割弄懂,後面**才能看得懂!**分割點大家都知道吧。1:0.618或者1.618:1,我們的斐波那契數列越往後的項數 越接近**分割比例,打個比方 

斐波那契數列第k項f[k] = f[k-1]+f[k-2]。f[k-1] : f[k-2] ≈ 1:0.618。回憶下我們的折半查詢mid = (low+high)/2取中間的位置,我們的插值查詢呢 mid = (low+high)*(key-arr[low])/(arr[high]-arr[low])根據key值的乙個佔比來確定mid的位置。那麼我們的斐波那契查詢呢,就是採用斐波那契數列來確定mid的位置!mid = low + f[k-1] - 1;看下圖:

**和折半查詢很相似,計算mid的公式變為mid = low + f[k-1] - 1;然後就是將目標陣列資料擴充至f[k]-1個,擴充元素值為最值。

#define _crt_secure_no_warnings

#include #include void printarr(int* arr,int length)

printf("\n");

return;

}//構造斐波那契數列

int* fibonacci_arr(int length)

return arr;

}//斐波那契查詢法

//arr 陣列,下標為[0,length-1],length 陣列長度,key 查詢的關鍵字

//返回查詢值的下標 ,沒查詢到 返回-1

int fibonacci_search(int *arr,int* f, int length, int key)

//arr陣列長度不滿足斐波那契資料項長度 將後面的值填充為最大值

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

while (low <= high)

else if(key > arr[mid])

else

else

}} return -1;

}int main(int argc, char *argv)

;//10個元素,空幾個位置預留用

int length = 10;

//構造斐波那契數列

int *f = fibonacci_arr(length);

printf("斐波那契數列:");

printarr(f, length);

printf("目標陣列 :");

printarr(arr, 10);

//斐波那契查詢

int key = 46;

int index = fibonacci_search(arr, f, length, key);

printf("%d的下標index = %d\n", key, index);

key = 56;

index = fibonacci_search(arr, f, length, key);

printf("%d的下標index = %d\n", key, index);

演算法 查詢 斐波那契查詢

相對於二分查詢和差值查詢,斐波那契查詢的實現略顯複雜。但是在明白它的主體思想之後,掌握起來也並不太難。既然叫斐波那契查詢,首先得弄明白什麼是斐波那契數列。相信大家對這個著名的數列也並不陌生,無論是c語言的迴圈 遞迴,還是高數的數列,斐波那契數列都是乙個重要的存在。而此處主要是用到了它的一條性質 前乙...

斐波那契查詢演算法

與二分查詢相比,斐波那契查詢演算法的明顯優點在於它只涉及加法和減法運算,而不用除法。因為除法比加減法要占去更多的機時,因此,斐波那契查詢的平均效能要比折半查詢好。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...