二分法問題
二項対立の実装はそれほど難しくありません。しかし、インターネット上のいくつかの実装方法は間違っています。問題はループの終了と途中での判定にあります。実装コードは次のとおりです。
def bsearch(arr,v):
left,right=0,len(arr)
while left <= right:
mid = (left + right) // 2
if arr[mid] == v:
return mid
elif arr[mid] > v:
right = mid-1
else:
left = mid+1
else:
return -1
質問 1: 終了条件
終了条件は右>=左である必要があります。一部の実装メソッドでは right>left が使用され、無限ループが発生する可能性があります。
質問 2: 右 = 中央 1
上限と下限を変更する場合、right=mid は正しくありません。右 =mid-1 である必要があります。同様に、left はmid+1 である必要があります。
高速で修飾された添え字を返すことができる、bisect の二分法を使用することをお勧めします。