斐波那契查詢
斐波那契查詢也是折半查詢的一種改良版;斐波那契查詢最主要的就是找mid這個點;
在該種查詢演算法中,我們要找的mid這個點為陣列中的**分割點,要求**分割點
我們就要用到斐波那契數列了;我們可以看一下這個數列:1,1,2,3,5,8,13,21,34,55..........;
可以看出倆個規律:
1:從第三項開始每一項等於它的前兩項的和;
2:數列越往後,前後兩項的比值越接近0.618,也就是**比例的比值;
利用這兩個規律我們就可以來找這個**分割點;我們令這個陣列為f,下標為k;
斐波那契查詢的核心就是在mid前面的長度為f[k-1]-1,在mid的後面的長度為f[k-2]-1;
具體步驟:(記待查詢的陣列為a)
1:構建斐波那契陣列;
2:找到n(a陣列的長度)在斐波那契陣列中的位置,並將陣列補全(可用a(n-1)來補);
3:計算mid=low+f(k-1)-1;
4:如果a[mid]>key(key為要查詢的數)high=mid-1;k=k-1;(mid前面的長度)
5:如果a[mid[
6:如果a[mid]=key &&mid<=high 則返回下標值(即mid的值);否則查詢失敗;
#includeusing斐波那契查詢是折半查詢的公升級版,那麼也要求序列是有序的序列;namespace
std;
int max_size=20
;void fbnq_list(int *a)//
構建斐波那契陣列;
}int fbnq_search(int a,int n,int
key)
else
if(a[mid]
else
}return -1
;
}int
main()
;
intkey;
cin>>key;
int x=fbnq_search(a,12
,key);
if(x!=-1) cout/
輸出所對應的下標;
else cout<
沒有該元素";
return0;
}
在最壞情況下,斐波那契查詢的時間複雜度還是o(log2n),且其期望複雜度也為o(log2n),
但是與折半查詢相比,斐波那契查詢的優點是它只涉及加法和減法運算,而不用除法,
而除法比加減法要占用更多的時間,因此,斐波那契查詢的執行時間理論上比折半查詢小,
但是還是得視具體情況而定。
斐波那契查詢
斐波那契查詢 斐波那契查詢的核心是 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...