查詢演算法__Fibonacci查詢
查詢演算法__Fibonacci查詢
思路與原理
閱讀博文查詢演算法__二分查詢會發現,其還存在改進的餘地,不難發現轉向左、右分支前的關鍵碼比較次數不等,而遞迴深度卻相同。
改進思路:若能通過遞迴深度的不均衡,對轉向成本的不均衡進行補償,平均查詢長度應能進一步縮短。
設,則可取,於是前後子向量的長度分別為、
C++實現
template<typename T>
int fibSearch(T *A,const T &e,int lo,int hi)
{
Fib fib(hi-lo);//建立fibonacci數列
while(lo<hi)
{
//通過向前順序查詢,確定形如fib(k)-1的軸點(分攤O(1))
while(hi-lo<fib.get()) fib.prev();
int mid=lo+fib.get()-1;//按黃金比例切分
if(e<A[mid])
hi=mid;//深入前半段[lo,mid)繼續查詢
else if(e>A[mid])
lo=mid+1;//深入後半段[mid+1,hi)
else
return mid;//在mid處命中
}
return -1;//查詢失敗
}
結論
Fibonacci查詢的ASL(平均查詢長度),(在常係數的意義上)優於二分查詢。
相關文章
- 查詢演算法__插值查詢演算法
- #查詢演算法#【1】簡單查詢:順序、折半查詢演算法
- 查詢演算法__二分查詢演算法
- 查詢演算法之二分查詢演算法
- 查詢演算法演算法
- 演算法 - 查詢演算法
- 演算法(查詢)演算法
- 二分查詢【折半查詢】演算法 PHP 版演算法PHP
- 查詢演算法集:順序查詢、二分查詢、插值查詢、動態查詢(陣列實現、連結串列實現)演算法陣列
- SQL查詢的:子查詢和多表查詢SQL
- 查詢之折半查詢
- mysql-分組查詢-子查詢-連線查詢-組合查詢MySql
- 查詢演算法(上)演算法
- 查詢演算法(下)演算法
- Java 查詢演算法Java演算法
- 常用查詢演算法演算法
- 複雜查詢—子查詢
- 查詢——二分查詢
- 子查詢-表子查詢
- 查詢(1)--靜態查詢
- 查詢(2)--動態查詢
- MYSQL學習筆記25: 多表查詢(子查詢)[標量子查詢,列子查詢]MySql筆記
- 如何找東西?查詢演算法之順序查詢和二分查詢詳解演算法
- 分塊查詢【大規模資料查詢演算法優化】【索引順序查詢】演算法 PHP 版演算法優化索引PHP
- 資料庫 - 連線查詢、巢狀查詢、集合查詢資料庫巢狀
- 插值查詢演算法演算法
- 子字串查詢演算法字串演算法
- 雜湊查詢演算法演算法
- 線性查詢演算法演算法
- 常用查詢演算法 (轉)演算法
- 離線查詢與線上查詢
- 【SQL查詢】集合查詢之INTERSECTSQL
- 查詢與排序02,折半查詢排序
- 查詢
- 【演算法】二分查詢與暴力查詢(白名單過濾)演算法
- oracle 精確查詢和模糊查詢Oracle
- pgsql查詢優化之模糊查詢SQL優化
- MySQL - 資料查詢 - 簡單查詢MySql