python実装二分検索およびbisectモジュールの概要
検索ではpythonにlistがあります.index()の方法.
二分検索のオブジェクトは、整列配列です.この点は特に注意が必要だ.
アルゴリズムの基本手順:1.配列の中間要素から始まり、中間要素がちょうど検索する要素であれば、検索プロセスは終了します.2.ある特定の要素が中間要素より大きいか小さい場合、配列が中間要素より大きいか小さいかの半分で検索され、最初と同じように中間要素から比較されます.3.あるステップで配列が空の場合は、見つからないことを意味します.この検索アルゴリズムは、比較のたびに検索範囲を半分に縮小します.時間複雑度:O(logn)
以下に2つの実装方法があり、1つは再帰であり、もう1つはwhileサイクル制御である.
python標準ライブラリにはbisectというグレーの常給力モジュールがあります.このライブラリは秩序あるシーケンスを受け入れ,内部実装は二分である.
<span style="font-size:14px;">>>> a=[2,4,1,9,3] #list ,
>>> a.index(4) # list
1</span>
これはpythonにおける基本的な検索方法であり、簡単であるが、時間的複雑度がO(n)であるため、大規模なクエリーには不十分である可能性がある.二分検索は代替方法です.二分検索のオブジェクトは、整列配列です.この点は特に注意が必要だ.
アルゴリズムの基本手順:1.配列の中間要素から始まり、中間要素がちょうど検索する要素であれば、検索プロセスは終了します.2.ある特定の要素が中間要素より大きいか小さい場合、配列が中間要素より大きいか小さいかの半分で検索され、最初と同じように中間要素から比較されます.3.あるステップで配列が空の場合は、見つからないことを意味します.この検索アルゴリズムは、比較のたびに検索範囲を半分に縮小します.時間複雑度:O(logn)
以下に2つの実装方法があり、1つは再帰であり、もう1つはwhileサイクル制御である.
def binarySearch1(lst,value,low,high):
if high < low:
return -1
mid = (low+high)/2
if lst[mid]>value:
return binarySearch1(lst,value,low,mid-1)
elif lst[mid]<value:
return binarySearch1(lst,value,mid+1,high)
else:
return mid
def binarySearch2(lst,value):
low,high = 0,len(lst)-1
while low<=high:
mid = (low+high)/2
if lst[mid]<value:
low = mid + 1
elif value<lst[mid]:
high = mid - 1
else:
return mid
return -1
if __name__ == '__main__':
l = range(50)
print binarySearch1(l,10,0,49)
print binarySearch2(l,10)
python標準ライブラリにはbisectというグレーの常給力モジュールがあります.このライブラリは秩序あるシーケンスを受け入れ,内部実装は二分である.
import bisect
def binarySearch3(lst,x):
i = bisect.bisect_left(lst,x)
if i != len(lst) and lst[i] == x:
return i
raise ValueError
if __name__ == '__main__':
lst = sorted([2,5,2,7,3])
print binarySearch3(lst,5)