日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

查找算法:斐波那契查找算法实现及分析

發布時間:2025/3/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 查找算法:斐波那契查找算法实现及分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

斐波那契查找算法介紹

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

代碼運行檢測



總結

以上是生活随笔為你收集整理的查找算法:斐波那契查找算法实现及分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。