查詢演算法__Fibonacci查詢

Enjoy_process發表於2019-03-06

                                              查詢演算法__Fibonacci查詢

 

 

思路與原理

閱讀博文查詢演算法__二分查詢會發現,其還存在改進的餘地,不難發現轉向左、右分支前的關鍵碼比較次數不等,而遞迴深度卻相同。

改進思路:若能通過遞迴深度的不均衡,對轉向成本的不均衡進行補償,平均查詢長度應能進一步縮短。

n=fib(k)-1,則可取mi=fib(k-1)-1,於是前後子向量的長度分別為fib(k-1)-1fib(k-2)-1

 

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(平均查詢長度),(在常係數的意義上)優於二分查詢。

相關文章