斐波那契查詢法肯定與斐波那契相關嘛,斐波那契數列 又稱**分割數列。所以我們先把**分割弄懂,後面**才能看得懂!**分割點大家都知道吧。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...