1. 程式人生 > >斐波那契查詢與黃金分割

斐波那契查詢與黃金分割

黃金分割:指事物各部分間一定的數學比例關係,即將整體一分為二,較大部分與較小部分之比等於整體與較大部分之比,其比值約為1:0.618或1.618:1;

0.618被公認為最具有審美意義的比例數字,不僅體現在諸如繪畫、雕塑、音樂、建築等藝術領域,而且在管理、工程設計等方面也有著不可忽視的作用,因此被稱為黃金分割;

斐波那契數列:1,1,2,3,5,8,13,21,34,55,89......(從第三個數開始,後邊每一個數都是前兩個數的和),然後我們會發現,隨著斐波那契數列的遞增,前後兩個數的比值會越來越接近0.618,利用這個特性,我們就可以將黃金比例運用到查詢技術當中;

基本思想:二分查詢的一種提升演算法,通過運用黃金比例的概念在數列中選擇查詢點進行查詢,提高查詢效率。同樣地,斐波那契查詢也屬於一種有序查詢演算法。

1.要求開始表中記錄的個數為某個斐波那契數-1,即n=F(k)-1;
2.開始將key值與第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)=F(k)-1-F(k-1)=F(k-2)-1,所以可以遞迴地應用斐波那契查詢;
(3)<,high=mid-1,k-=1;說明:high=mid-1說明待查詢的元素在[low, mid-1]範圍內,k-=1說明範圍[low, mid-1]內的元素個數為F(k-1)-1,所以可以遞迴地應用斐波那契查詢;

為什麼規定n=F(k)-1呢?原因很簡單:
是為了格式上的統一,以方便遞迴或者迴圈程式的編寫。表中的資料是F(k)-1個,使用mid值進行分割又用掉一個,那麼剩下F(k)-2個。正好分給兩個子序列,每個子序列的個數分別是F(k-1)-1與F(k-2)-1個,格式上與之前是統一的。不然的話,每個子序列的元素個數有可能是F(k-1),F(k-1)-1,F(k-2),F(k-2)-1個,寫程式會非常麻煩。

時間複雜度:O(log2^n)