每日coding 查詢演算法 斐波那契查詢

2021-09-27 02:29:40 字數 1444 閱讀 5143

斐波那契數列,又稱**分割數列,指的是這樣乙個數列: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)。

演算法描述

斐波那契查詢與折半查詢很相似,他是根據斐波那契數列的特點對有序表進行分割的。他要求開始表中記錄的個數比某個斐波那契數小1,即n=f(k)-1;當記錄不滿足時,後面的元素都賦值為最後乙個值。(注:使得n=f(k)-1是因為:如果表中的資料為f(k)-1個,mid分割又用掉乙個,剩下f(k)-2個,正好分給兩個子串行,每個子串行的長度為f(k-1)-1和f(k-2)-1,格式和之前的統一,方便遞迴程式設計實現)

mid=low+f(k−1)−1

將value值與第mid位置的記錄進行比較,比較結果分為三種:

相等,則返回mid

大於,low = mid + 1low=mid+1,k = k - 2

小於,high = mid - 1high=mid−1,k = k - 1

(說明:low=mid+1說明待查詢的元素在[mid+1,high]範圍內,k-=2 說明範圍[mid+1,high]內的元素個數為f(k-2)-1個)

複雜度分析

最壞情況下,時間複雜度為o(log2n),且其期望複雜度也為o(log2n)。

演算法實現

#includeusing namespace std;

int fabonacci(int n)

int fibonacci_search(int nums, int begin, int end, int key)

else

}if(begin>end)

return -1;

}int main() ;

int len=sizeof(nums)/sizeof(nums[0]);

int key,location=-1;

cin>>key;

location=fibonacci_search(nums,0,len-1,key);

if(location==-1)

cout<查詢演算法比較

均效能平均效能:斐波那契》折半》插值

折半查詢進行加法與除法運算(mid = (low + high) / 2)

插值查詢進行複雜的四則運算( mid = low + (key - a[low] / (a[high] - a[low]) * (high - low)) )

斐波那契查詢只是運用簡單加減法運算 (mid = low + f[k-1] -1)

在海量的資料查詢過程中,這種席位的差別會影響最終的查詢效率。三種有序表的查詢本質上是分割點的選擇不同,各有優劣,實際開發可根據資料的特點綜合考慮再做決定。

斐波那契查詢演算法

與二分查詢相比,斐波那契查詢演算法的明顯優點在於它只涉及加法和減法運算,而不用除法。因為除法比加減法要占去更多的機時,因此,斐波那契查詢的平均效能要比折半查詢好。include void fibonacci int f int fibonacci search int a,int key,int n...

斐波那契查詢演算法

斐波那契查詢的核心是 1 當key a mid 時,查詢成功 2 當keya mid 時,新的查詢範圍是第mid 1個到第high個,此時範圍個數為f k 2 1個,即陣列右邊的長度,所以要在 f k 2 1 範圍內查詢。如下 1 include2 include 3 include4 includ...

斐波那契查詢演算法

斐波那契查詢原理與二分查詢或者插值查詢演算法類似,僅僅改變了中間結點 mid 的位置,mid 不再是中間或插值得到,而是位於 分割點附近,即 mid low f k 1 1 f 代表斐波那契數列 如下圖所示 由斐波那契數列 f k f k 1 f k 2 的性質,可以得到 f k 1 f k 1 1...