查詢演算法__二分查詢

Enjoy_process發表於2019-03-05

                                             查詢演算法__二分查詢

 

 

原理

減而治之:以任一元素x=A[mid]為界,都可將待查詢區間分為三部分

A[lo,mid)\leq A[mid]\leq A(mid,hi)

只需將目標元素ex做一比較,即可分三種情況進一步處理:

1)e<x:則e若存在必屬於左側子區間A[lo,mid),故可遞迴深入

2)e>x:則e若存在必屬於右側子區間A(mid,hi),故可遞迴深入

3)e=x:在此處命中,返回下標位置,並結束

 

C++實現

函式說明:如果查詢成功返回其下標(如果有多個,返回任意一個),如果查詢失敗返回-1

template<typename T>//在有序區間[lo,hi)內查詢元素e 
int binSearch(T *A,T const &e,int lo,int hi)
{
	while(lo<hi)//每步迭代可能要做出兩次比較判斷,有三個分支
	{
		int mid=(lo+hi)>>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;//查詢失敗 
}

 

時間複雜度分析

線性遞迴:T(n)=T(n/2)+O(1)=O(logn)大大優於順序查詢

遞迴跟蹤:軸點總取中點,遞迴深度O(logn),各遞迴例項均耗時O(1)

 

查詢長度分析(比時間複雜度估計更準確的評估方法)

1、查詢成功

2、查詢失敗

成功、失敗時的平均查詢長度均大致為O(1.5logn)

示例分析

 成功時的平均查詢長度:

\frac{2+3+4+4+5+5+6}{7}=\frac{29}{7}=4.14\approx 1.5log_{2}7

失敗時的平均查詢長度:

\frac{3+4+4+5+4+5+5+6}{8}=\frac{36}{8}=4.5\approx 1.5log_{2}7

相關文章