二分查找:
在有序表的前提下采用分而治之(從中間項開始),這樣對比範圍就可以縮小爲n/2,
查找過程與實現原理:
將問題分解爲若干更小規模部分的問題,並將結果彙總得到原問題的解
python實現代碼:
###二分查找 普通版
def binarysearch(alist,item):
first=0
last=len(alist)-1
found=False
while first<=last and not found:
midpoint=(first+last)//2
if alist[midpoint]==item:
found=True
else:
if item < alist[midpoint]:
last=midpoint-1
else:
first =midpoint+1
return found
## 測試實例
testlist1=[0,1,3,8,10,17,19,32,43]
print(binarysearch(testlist1,3)) #True
print(binarysearch(testlist1,13)) #False
二分查找,在有序的前提下,先劃分區間,然後對比中間項,縮小問題規模,在劃分區間,接着對比然後縮小規模,恰好是遞歸算法的求解思路.。
## 二分查找,遞歸版
def binarysearch2(alist,item):
if len(alist)==0:
return False ##基本結束條件
else:
midpoint=len(alist)//2
if alist[midpoint]==item:
return True
else:
if item <alist[midpoint]:
return binarysearch2(alist[: midpoint],item) #調用自身
else:
return binarysearch2(alist[midpoint+1 :],item)
##測試實例
testlist1=[0,1,3,8,10,17,19,32,43]
print(binarysearch2(testlist1,13)) # False
print(binarysearch2(testlist1,3)) # True
算法分析:
二分查找每次比對都將範圍縮小一半,因此第i次時,其剩下範圍爲n/2^i,
對比次數足夠多時,範圍內就會僅剩1個數據項。因此得到: i=log2(n)
綜上:二分查找的算法複雜度爲O(log n)
注意:二分查找時需要考慮對數據項進行排序的開銷,若僅排序一次,可忽略其時間,若數據經常變動,則排序耗時長,可能還沒順序查找來的快!