轉)斐波那契查詢演算法(黃金分割查詢演算法)

2022-01-10 14:45:12 字數 1951 閱讀 7738

斐波那契數列,又稱**分割數列,指的是這樣乙個數列: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]個元素,找出要查詢的元素在那一部分並遞迴,直到找到。

斐波那契查詢的時間複雜度還是o(log 2 n ),但是 與折半查詢相比,斐波那契查詢的優點是它只涉及加法和減法運算,而不用除法,而除法比加減法要占用更多的時間,因此,斐波那契查詢的執行時間理論上比折半查詢小,但是還是得視具體情況而定。

對於斐波那契數列:1、1、2、3、5、8、13、21、34、55、89……(也可以從0開始),前後兩個數字的比值隨著數列的增加,越來越接近**比值0.618。比如這裡的89,把它想象成整個有序表的元素個數,而89是由前面的兩個斐波那契數34和55相加之後的和,也就是說把元素個數為89的有序表分成由前55個資料元素組成的前半段和由後34個資料元素組成的後半段,那麼前半段元素個數和整個有序表長度的比值就接近**比值0.618,假如要查詢的元素在前半段,那麼繼續按照斐波那契數列來看,55 = 34 + 21,所以繼續把前半段分成前34個資料元素的前半段和後21個元素的後半段,繼續查詢,如此反覆,直到查詢成功或失敗,這樣就把斐波那契數列應用到查詢演算法中了。

從圖中可以看出,當有序表的元素個數不是斐波那契數列中的某個數字時,需要把有序表的元素個數長度補齊,讓它成為斐波那契數列中的乙個數值,當然把原有序表截斷肯定是不可能的,不然還怎麼查詢。然後圖中標識每次取斐波那契數列中的某個值時(f[k]),都會進行-1操作,這是因為有序表陣列位序從0開始的,純粹是為了迎合位序從0開始。所以用迭代實現斐波那契查詢演算法如下:

#include #define fib_maxsize 100  

/**

* 生成斐波那契數列

* @param fib:指向儲存斐波那契數列的陣列的指標

* @param size:斐波那契數列長度

*/

void producefib(int *fib, int size)

} /**

* 斐波那契查詢,查詢成功返回位序,否則返回-1

* @param data:有序表陣列

* @param length:有序表元素個數

* @param searchvalue:待查詢關鍵字

*/

int fibonaccisearch(int *data, int length, int searchvalue)

// 補齊有序表

for (i = length; i <= fib[k] - 1; i++)

while (low <= high)

else

} if (data[mid] > searchvalue)

if (data[mid] < searchvalue)

} return -1;

}

int main()

;

int index = fibonaccisearch(data, 11, 19);

printf("%d\n", index);

return 0;

}

斐波那契查詢的時間複雜度還是o(log2n),但是與折半查詢相比,斐波那契查詢的優點是它只涉及加法和減法運算,而不用除法,而除法比加減法要占用更多的時間,因此,斐波那契查詢的執行時間理論上比折半查詢小,但是還是得視具體情況而

斐波那契(黃金分割)查詢

斐波那契數列 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 ...

查詢演算法 斐波那契查詢 黃金分割法

斐波那契搜尋 fibonacci search 又稱斐波那契查詢,是區間中單峰函式的搜尋技術。斐波那契搜尋就是在二分查詢的基礎上根據斐波那契數列進行分割的。在斐波那契數列找乙個等於略大於查詢表中元素個數的數f n 將原查詢表擴充套件為長度為f n 如果要補充元素,則補充重複最後乙個元素,直到滿足f ...