斐波那契數列,又稱**分割數列,指的是這樣乙個數列:1、1、2、3、5、8、13、21、····,在數學上,斐波那契被遞迴方法如下定義:f(1)=1,f(2)=1,f(n)=f(n-1)+f(n-2) (n>=2)。該數列越往後相鄰的兩個數的比值越趨向於**比例值(0.618)。
斐波那契查詢就是在二分查詢的基礎上根據斐波那契數列進行分割的。在斐波那契數列找乙個等於略大於查詢表中元素個數的數f[n],將原查詢表擴充套件為長度為fn,完成後進行斐波那契分割,即f[n]個元素分割為前半部分f[n-1]個元素,後半部分f[n-2]個元素,找出要查詢的元素在那一部分並遞迴,直到找到。
斐波那契查詢與折半查詢很相似,他是根據斐波那契序列的特點對有序表進行分割的。他要求開始表中記錄的個數為某個斐波那契數小1,及n=f(k)-1;開始將k值與第f(k-1)位置的記錄進行比較(及mid=low+f(k-1)-1),比較結果也分為三種:
(1)相等,則mid位置的元素即為所求;
(2)>,則low=mid+1,k-=2;
說明:low=mid+1說明待查詢的元素在[mid+1,high]範圍內,k-=2 說明範圍[mid+1,high]內的元素個數為n-(f(k-1))=fk-1-f(k-1)=fk-f(k-1)-1=f(k-2)-1個,所以可以遞迴的應用斐波那契查詢。
(3))<,則high=mid-1,k-=1。
說明:low=mid+1說明待查詢的元素在[low,mid-1]範圍內,k-=1 說明範圍[low,mid-1]內的元素個數為f(k-1)-1個,所以可以遞迴的應用斐波那契查詢。
在最壞情況下,斐波那契查詢的時間複雜度還是o(log2n),且其期望複雜度也為o(log2n),但是與折半查詢相比,斐波那契查詢的優點是它只涉及加法和減法運算,而不用除法,而除法比加減法要占用更多的時間,因此,斐波那契查詢的執行時間理論上比折半查詢小,但是還是得視具體情況而定。
public class fibonaciisort ;
int i = fibonaciisort(arr, 1234);
system.out.println("下標"+i);
}public static int fib()
return f;}/*
* @param arr:
* @param key: 要查詢的值
* @return: int 對應下標
* @description:
*/public static int fibonaciisort(int arr,int key)
//因為f【k】,可能大於陣列長度,因此需要不齊
//不足部分使用0填充
int temp = arrays.copyof(arr, f[k]); //擴充到 f[k]個陣列長度
//用陣列最後的數 填充temp
//舉例:
//temp= =>
for (int i = high+1; i < temp.length; i++)
//使用whlie迴圈找到key
while (low <= high) else if (key>temp[mid])elseelse}}
return -1;
}}
斐波那契查詢
斐波那契查詢 斐波那契查詢的核心是 1 當key a mid 時,查詢成功 2 當key 3 當key a mid 時,新的查詢範圍是第mid 1個到第high個,此時範圍個數為f k 2 1個,即陣列右邊的長度,所以要在 f k 2 1 範圍內查詢。與二分查詢相比,斐波那契查詢演算法 的明顯優點在...
斐波那契查詢
與二分查詢相比,斐波那契查詢演算法的明顯優點在於它只涉及加法和減法運算,而不用除法。因為除法比加減法要占去更多的機時,因此,斐波那契查詢的平均效能要比折半查詢好。斐波那契查詢與折半查詢的時間複雜度間同為o log2 log2n 平均 情況下,斐波那契查詢優於折半查詢,但最壞情況下則差於折半查詢。斐波...
斐波那契查詢
基於二分法 此演算法依靠斐波那契數列 來跳轉比較位置 在玩數字板所以有了手寫圖 單步驟原理如下 c語言實現 include include define return fail 1 斐波那契查詢 int fibonaccisearch int src int,int src len,int sear...