斐波那契搜尋(fibonacci search) ,又稱斐波那契查詢,是區間中單峰函式的搜尋技術。
斐波那契搜尋就是在二分查詢的基礎上根據斐波那契數列進行分割的。在斐波那契數列找乙個等於略大於查詢表中元素個數的數f[n],將原查詢表擴充套件為長度為f[n] (如果要補充元素,則補充重複最後乙個元素,直到滿足f[n]個元素),完成後進行斐波那契分割,即f[n]個元素分割為前半部分f[n-1]個元素,後半部分f[n-2]個元素,找出要查詢的元素在那一部分並遞迴,直到找到。
o(log2n)斐波那契查詢原理與插值查詢、二分查詢相似,僅僅改變了中間結點(mid)的位置,mid不再是中間或插值得到,而是位於**分割點附近,即mid=low+f(k-1)-1(f代表斐波那契數列),如下圖所示:
對f(k-1)-1的理解:
由斐波那契數列 f[k]=f[k-1]+f[k-2] 的性質,可以得到 (f[k]-1)=(f[k-1]-1)+(f[k-2]-1)+1 。該式說明:只要順序表的長度為f[k]-1,則可以將該錶分成長度為f[k-1]-1和f[k-2]-1的兩段,即如上圖所示。從而中間位置為mid=low+f(k-1)-1 。
類似的,每一子段也可以用相同的方式分割。
但順序表長度n不一定剛好等於f[k]-1,所以需要將原來的順序表長度n增加至f[k]-1。這裡的k值只要能使得f[k]-1恰好大於或等於n即可,由以下**得到,順序表長度增加後,新增的位置(從n+1到f[k]-1位置),都賦為n位置的值即可。
// 獲取斐波那契輔助查詢的索引k
while
(right > fibarr[k]-1
)
public
class
fibsearch
;int i =
fibsearch
(arr,5)
; system.out.
println
(i);
}/**
* 獲取斐波那契陣列
** @param maxsize 最大陣列長度
* @return 斐波那契陣列
*/public
static
int[
]fibarr
(int maxsize)
return arr;
}public
static
intfibsearch
(int
arr,
int searchval)
// 原陣列長度不一定和斐波那契的值一致 所以可能需要擴容
// -> [1, 5, 22, 189, 999, 6666, 0, 0]
int[
] temp = arrays.
copyof
(arr, fibarr[k]);
// 將0替換成最大的數
for(
int i = arr.length; i < temp.length; i++
)while
(left <= right)
else
if(temp[mid]
< searchval)
else
return mid;}}
// 沒找到
return-1;}}
相比二分查詢,在某些情況下效能比二分查詢慢,我個人認為這更像是玄學查詢。 斐波那契(黃金分割)查詢
斐波那契數列 1,1,2,3,5,8,13 可以發現相鄰的兩個數無限接近 分割點。中間值 mid low f k 1 1 f代表斐波那契數列 理解 1.斐波那契數列 f k f k 1 f k 2 的性質。可以得到f k 1 f k 1 1 f k 2 1 1 所以只要順序表的長度為f k 1,就可...
斐波那契(黃金分割)查詢
斐波那契數列 1 1 2 3 5 8 13 21 分割點是指把一條線段分割成倆部分,使其中一部分與全長之比等於另一部分與這部分之比。取其前三位數字的近似值是0.618,由於按比例設計地造型十分美麗,因此被叫 分割,也成為中外比 對f k 1 1的理解 1 由斐波那契數列 f k f k 1 f k ...
轉)斐波那契查詢演算法(黃金分割查詢演算法)
斐波那契數列,又稱 分割數列,指的是這樣乙個數列 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 斐波那契查詢就是在二分查詢的基礎上根據斐波那契數列進...