での値から右に検索されます私が説明しようとさせてくださいバイナリ検索が動作する理由我々は我々が持っているでしょう、次の順序A=[-5, 10, 14, 33, 42, 42, 42]
とsearched_value = 14
をしましたとしましょう:
Iteration 1, lo = 0, hi = 6, mid = 3 A[mid] > 14
Iteration 2, lo = 0, hi = 2, mid = 1 A[mid] < 14
Iteration 3, lo = 2, hi = 2, mid = 2 A[mid] = 14 (found!)
アルゴリズムの各反復において、我々はlo
とhi
は常に検索値の位置を含んでおり、我々はそれを証明するだろうと結論できました
誘導仮説:繰り返しの数に誘導することにより、検索値は、それが常にlo
とhi
の間に含まれる配列中に存在する場合。
基本事例:検索値は、それがlo
とhi
の間に含まれることがあります配列中に存在する、そして不変は自明正しいかどう反復1 lo = 0
とhi = n-1
では、結果のすべての要素が含まれています。
誘導ステップ:検索値がlo
とhi
の間に含まれている場合いずれかの段階で、それは次の反復でlo
とhi
の間に含まれることを継続します。この場合、アルゴリズムが正しく順序で検索値の位置を報告し終了して検索するので不変が正しい:A[mid] = searched_value
場合
- :我々は3つの可能性(と、ここで質問に対する答えですが)しました値は
lo
とhi
の間でした。
A[mid] < searched_value
場合 :それはソート順序だことを知って、(
A[mid]
含む)
A[lo...mid] < searched_value
間のすべての要素は、したがって、私たちは
lo=mid+1
(安全上半分にのみ検索)を割り当てることができますし、不変は、まだ次の反復で正しいでしょう。
A[mid] > searched_value
場合 :それはソート順序だことを知って、(
A[mid]
含む)
A[mid...hi] > searched value
間のすべての要素は、したがって、私たちは、
hi=mid-1
(安全に下半分のみを検索)ASSINGことができ、不変は、まだ次の反復で正しいでしょう。 、各反復において、アルゴリズムは常に小さなセグメントシーケンスの に検索すること
searched_value
であるか、それは違うと、次の反復であるだけで1要素がどちらかありますので、終了条件が保証され、与えられた
アルゴリズムはそのような要素がシーケンスに存在しないことを報告することになる。
結果的にアルゴリズムは正しいと証明されます(また、mid+1
とmid-1
を使用する理由も証明されています)。
こんにちは、教えていただけますか? – Mila
例はあなたにはっきりしていますか? –
こんにちは、あなたの説明は、私は非常によく、pythonは、boudariesを含むチェックされている半分の部分を破棄することを理解するのに役立ちます。しかし、私はそれが検索にどのように役立つか理解していません。なぜなら、Pythonはboudariesではなくmidをチェックするからです。これを私に説明してもらえますか? – Mila