斐波那契查找+思路分析
生活随笔
收集整理的這篇文章主要介紹了
斐波那契查找+思路分析
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
圖解
代碼實現(xiàn)
package com.atguigu.search;import java.util.Arrays;/*** @創(chuàng)建人 wdl* @創(chuàng)建時間 2021/3/23* @描述*/ public class FibonacciSearch {public static int maxSize = 20;public static void main(String[] args) {int[] arr = {1, 8, 10, 89, 1000, 1234};System.out.println(fibSearch(arr,44));}//因為后面我們mid=low+F(k+1)-1,需要使用到斐波那契數(shù)列,因此我們需要先獲取到一個斐波那契數(shù)列//非遞歸方法得到一個斐波那契數(shù)列public static int[] fib() {int[] f = new int[maxSize];f[0] = 1;f[1] = 1;for (int i = 2; i < maxSize; i++) {f[i] = f[i - 1] + f[i - 2];}return f;}/*** @param a 數(shù)組* @param key 我們需要查找的關(guān)鍵碼(值)* @return 返回對應(yīng)的下標,如果沒有-1*///編寫斐波那契查找算法//使用非遞歸的方法編寫算法public static int fibSearch(int[] a, int key) {int low = 0;int high = a.length - 1;int k = 0;//表示斐波那契分割數(shù)值的下標int mid = 0;//存放mid值int f[] = fib();//獲取到斐波那契數(shù)列//獲取到斐波那契分割數(shù)的下標while (high > f[k] - 1) {k++;}//因為f[k]可能大于數(shù)組的長度,因此我們需要使用Arrays類,構(gòu)造一個新的數(shù)組,并指向a[]//不足的部分會使用0填充int[] temp = Arrays.copyOf(a, f[k]);//實際上需要使用a數(shù)組最后的數(shù)進行填充tempfor (int i = high + 1; i < temp.length; i++) {temp[i] = a[high];}//使用while來循環(huán)處理,找到我們的數(shù)keywhile (low <= high) {//只要這個條件滿足,就可以找mid = low + f[k - 1] - 1;if (key < temp[mid]) {//說明我們應(yīng)該繼續(xù)向數(shù)組的前面查找(左邊)high = mid - 1;//為什么是k--//說明//1.全部元素=前面的元素+后邊元素//2.f[k]=f[k-1]+f[k-2]//因為前面有f[k-1]個元素,所以可以繼續(xù)拆分f[k-1]=f[k-2]+f[k-3]//即在f[k-1]的前面繼續(xù)查找k--//即下次循環(huán)mid=f[k-1-1]-1k--;} else if (key > temp[mid]) {說明我們應(yīng)該繼續(xù)向數(shù)組的前面查找(右邊)low = mid + 1;//為什么是k-=2//說明//1.全部元素=前面的元素+后邊元素//2.f[k]=f[k-1]+f[k-2]//因為后面有f[k-2]個元素,所以可以繼續(xù)拆分f[k-2]=f[k-3]+f[k-4]//即在f[k-2]的后面繼續(xù)查找k-=2//即下次循環(huán)mid=f[k-1-2]-1k-=2;}else {//找到//需要確定,返回的是哪個下標if(mid<=high){return mid;}else {return high;}}}return -1;//沒有找到}} 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的斐波那契查找+思路分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 又一个资源下载圣地寻找圣地 RMVB 下
- 下一篇: 京东双十一预售提前京东双十一预售提前几天