序文
二分法は、より効率的な検索方法である二分探索としても知られています。
あなたの会社に張さんという名前の新しい人がいる場合、彼はあなたの会社の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バイナリ検索方法の再帰的方法を使用します。クエリ番号の倍数を取り、インデックス作成のためにインデックスの前半をロックすると、インデックス作成の手順にかかる時間が短縮されます。