查找算法:斐波那契查找算法实现及分析
生活随笔
收集整理的這篇文章主要介紹了
查找算法:斐波那契查找算法实现及分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
斐波那契查找算法介紹
斐波那契查找法肯定與斐波那契相關嘛,斐波那契數列 又稱黃金分割數列。所以我們先把黃金分割弄懂,后面代碼才能看得懂!黃金分割點大家都知道吧。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 <stdio.h> #include <stdlib.h>void PrintArr(int* arr,int length) {for (int i = 0; i < length; i++){printf("%3d ",arr[i]);}printf("\n");return; }//構造斐波那契數列 int* Fibonacci_Arr(int length) {int* arr = malloc(sizeof(int)*length);arr[0] = 0;arr[1] = 1;for (int i = 2; i < length; i++){arr[i] = arr[i - 1] + arr[i - 2];}return arr; }//斐波那契查找法 //arr 數組,下標為[0,length-1],length 數組長度,key 查找的關鍵字 //返回查找值的下標 ,沒查找到 返回-1 int Fibonacci_Search(int *arr,int* F, int length, int key) {int low = 0; //低位下標int high = length-1;//高位下標int mid; //中間值下標int k = 0; //斐波那契數列下標//計算arr的length 位于斐波那契數列的位置while (length > F[k] - 1){k++;}//arr數組長度不滿足斐波那契數據項長度 將后面的值填充為最大值for (int i = length; i < F[k]-1; i++){arr[i] = arr[high];}while (low <= high){mid = low + F[k - 1] - 1;//將mid的值設置為黃金分割點位置if (key < arr[mid]){high = mid - 1;k = k - 1;}else if(key > arr[mid]){low = mid + 1;k = k - 2;}else{if (mid <= length - 1){return mid;}else{return length - 1;}}}return -1; } int main(int argc, char *argv[]) {int arr[15] = { 0,1,2,13,24,35,46,57,68,99};//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);return 0; }代碼運行檢測
總結
以上是生活随笔為你收集整理的查找算法:斐波那契查找算法实现及分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智能指针:-和*运算符重载 + 模板技术
- 下一篇: python 文件按行读写