Python言語の二分探索

序文

二分法、より効率的な検索方法である二分探索として知られています。

あなたの会社に張さんという名前の新しい人がいる場合、彼はあなたの会社の47番目の人です。しばらくすると、張さんが不幸になって去るのを見る人もいますが、張さんは間違いなく会社の47番目の人ではありません。今回は、張さんが列のどこにいるかをどうやって知るのですか?二分法で彼を見つけましょう。

 

アイデア

1000ページとランダムなページ番号の本を考えて、それを最速の方法で見つける方法は?ページごとに段階的に検索する場合は、最大1000回検索する必要があります。では、この問題を二分法でどのように解決するのでしょうか。二分法の鍵は、二分法という言葉です。

 ステップ1:ページ番号を中心点として設定し、1000ページを2つの部分に分割します。中央値の効果は、検索範囲を毎回半分に減らすこと、つまり平方根の効果を実現することです。つまり、(最初+最後)/2=中央値を使用できます。

 ステップ2:検索するページ番号を中央値と比較します。中央値より大きい場合は、中央値の前半の検索が破棄されます。それ以外の場合は、範囲の後半の検索が破棄されて、平方根効果。ステップ3:新しいルックアップ範囲の中央値を再計算します

ステップ4:ページ番号を見つけ、中央値を比較して新しい検索範囲を決定しますステップ5:ページ番号が見つかるまで上記のステップを繰り返します

 .....。

コード

上記のアイデアを分析することで、二分法の実装手順を理解し、コードを介して手順を実装します。最初はループの実装です。

#模拟页码
array = [1, 3, 4, 6, 7, 8, 9, 11, 15, 17, 19, 21, 22, 25, 29, 33, 38, 69,99,107]
#首位值
low = 0
#末位值
height = len(array)-1
#设定查找页码
findNum = 1

#循环查找
while True:
    #获取中位数
    mid = int((low+height)/2)
    #打印中位数,查看循环次数
    print(array[mid])
    #如果中位数小于查找值,则锁定后半段
    if array[mid] < findNum:
        #重置低位数
        low = mid + 1
    #如果中位数大于查找值,则锁定前半段
    elif array[mid] > findNum:
        #重置高位值
        height = mid - 1
    #找到数字则打印该值下标,终止循环
    elif array[mid]==findNum:
        print('find it:',array[mid],' index:',mid)
        break

上記の方法に加えて、再帰を使用して達成することもでき、コードはより簡潔になります

array = [1, 3, 4, 6, 7, 8, 9, 11, 15, 17, 19, 21, 22, 25, 29, 33, 38, 69,99,107]

#函数递归
#定义一个函数,给三个形参:低位值,高位值,查找值
def BinarySearch(low,height,findNum):
    #计算出中位数
    middle = (low+height)//2
    #如果中位数小于查找值,则锁定后半段
    if findNum >array[middle]:
        #重置低位数
        low = middle +1
    #如果中位数大于查找值,则锁定前半段
    elif findNum<array[middle]:
        #重置高位值
        height = middle - 1
    else:
        #找到该值并返回
        return '该值下标为:%s,值为:%s'%(middle,array[middle])
    #没有找到则调用自身继续查找
    return BinarySearch(low,height,findNum)

print(BinarySearch(array[0],len(array)-1,19))

要約する

 

結果のフィードバックによると、二分法の通常のPython検索方法を使用して、21番を循環的に見つけ、彼は11位にランク付けされ、中央値は3回クエリされます。最初にPythonバイナリ検索方法の再帰的方法を使用します。クエリ番号の倍数を取り、インデックス作成のためにインデックスの前半をロックすると、インデックス作成の手順にかかる時間が短縮されます。

おすすめ

転載: blog.csdn.net/AI19970205/article/details/123464424