二分法についての質問

二分法問題

二項対立の実装はそれほど難しくありません。しかし、インターネット上のいくつかの実装方法は間違っています。問題はループの終了と途中での判定にあります。実装コードは次のとおりです。

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 の二分法を使用することをお勧めします。

おすすめ

転載: blog.csdn.net/weixin_42272768/article/details/128202544