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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

数据结构与算法 | 斐波那契查找

發布時間:2024/4/11 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法 | 斐波那契查找 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

要想能夠理解這一算法,需要先了解
1.二分查找
https://blog.csdn.net/qq_35423154/article/details/101383518
2.斐波那契數
https://blog.csdn.net/qq_35423154/article/details/101684466

黃金分割具有嚴格的比例性、藝術性、和諧性,蘊藏著豐富的美學價值,這一比值能夠引起人們的美感,被認為是建筑和藝術中最理想的比例。


蒙娜麗莎,斷臂的維納斯,這些我們經常見到的藝術品就是采用了黃金分割法,即0.618的比例。

而我們所熟知的斐波那契數列又叫做黃金分割數列,當它無限往下增加時,越到后面兩個數的比例就越來越接近0.618即黃金分割點。
在我們眼里,編程也是一種藝術,那么我們能否利用這個萬能的黃金分割法,運用到查找中呢?答案是肯定的,我們將斐波那契數與二分查找相結合,就得到了斐波那契查找,它與二分查找的思路相同,但是借助斐波那契數,可以僅僅使用加減法來完成查找,大大提高了效率。

那我們該如何實現呢?
例如我們要在

int a[] ={1,3,5,7,9,11,13,15,17,19};

查找這個17
首先我們需要找到這個數組的長度n在斐波那契數中的位置

它所處的位置是斐波那契數列中的第七位,而a中只有10個元素,而斐波那契的第七個數為13,所以我們需要補全數組,將數組補充至13-1位,補充的值為最后一項的值


如果我們的key值小于mid的時候,我們按照上圖,結合二分查找的思想,我們取到左邊的一塊,斐波那契數下標減1,我們的high值變為mid-1
而如果當key值大于mid的時候我們取到右邊的一塊,斐波那契數下標減2,我們的low值變為mid + 1

當我們的mid<=n時,說明mid即為我們查找到的下標。
當mid>n時,說明這個時候我們的mid為補全的下標,我們只需要返回一個原數組的最大下標就可以

完整代碼:

#include<stdio.h> #define MAXSIZE 100 void GitFib(int* fib) {int i;fib[0] = 0;fib[1] = 1;for(i = 2; i < MAXSIZE; i++){fib[i] = fib[i - 1] + fib[i - 2];} } int FibonacciSearch(int *a,int n,int key) {int i,mid,low=0,high= n ,k=0;int fib[MAXSIZE] = {0};GitFib(fib); while (n > fib[k] - 1){k++;}//找出n在斐波那契數中的位置 for (i = n; i<fib[k] -1; i++){a[i] = a[n];}//補全數組 while (low <= high){mid = low + fib[k-1] - 1;if (key <= a[mid]){high = mid - 1;k -= 1;}else if (key > a[mid]){low = mid + 1;k -= 2;}else{if (mid <= n)return mid;elsereturn n; }} } int main() {int a[] ={1,3,5,7,9,11,13,15,17,19};int key,i,n;n = sizeof(a)/sizeof(a[0])-1;printf("請輸入要查找的數據:");scanf("%d",&key);printf("%d\n",FibonacciSearch(a,n,key));return 0; }

插值查找,斐波那契查找都是二分查找的一種變式,它們的本質上的不同時分隔點的選擇不同,實際使用的時候根據數據的綜合特點考慮再進行選擇

總結

以上是生活随笔為你收集整理的数据结构与算法 | 斐波那契查找的全部內容,希望文章能夠幫你解決所遇到的問題。

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