二分探索アルゴリズムと例

⚡ スマートサマリー

二分探索アルゴリズムは、ソートされたリストの中から目的の項目を見つけるために、探索範囲を繰り返し半分に分割し、目的の項目をその中間の要素と比較します。半区間探索または対数探索とも呼ばれ、すべての要素を走査するよりもはるかに高速です。

  • ???? ソートされたデータ: 二分探索は、ソートされた項目のリストに対してのみ機能します。
  • 半減: 各ステップでは、目標値と中央値を比較し、範囲の半分を破棄します。
  • 対数: この検索はO(log n)の時間で実行され、線形検索よりもはるかに高速です。
  • 🎯 中間索引: 中央値は、(左+右)÷2 の底として求められます。
  • 🔁 反復: 要素が見つかるか、範囲が空になるまで、このプロセスが繰り返されます。

二分探索アルゴリズムとその例

二分探索を学ぶ前に、まず探索とは何かを学びましょう。

検索とは何ですか?

検索は、ユーザーがデータベース内に保持されているドキュメント、ファイル、メディア、またはその他の種類のデータを検索できるようにするユーティリティです。 検索は、基準とレコードを照合し、それをユーザーに表示するという単純な原理に基づいて機能します。 このようにして、最も基本的な検索機能が機能します。

二分探索とは何ですか?

バイナリサーチは、ソートされたアイテムのリストからデータを見つけて取得する高度な検索アルゴリズムです。その基本的な動作原理は、必要な値が見つかり、検索結果としてユーザーに表示されるまで、リスト内のデータを半分に分割することです。バイナリサーチは一般的に、 半間隔検索 または 対数検索.

二分探索はどのように機能するのでしょうか?

バイナリ検索は次のように動作します。

  • 検索プロセスは、ソートされたデータ配列の中央の要素を見つけることから開始されます。
  • その後、キーの値が要素と比較されます。
  • キー値が中央の要素よりも小さい場合、検索では中央の要素よりも大きい値を比較して照合します。
  • キー値が中央の要素より大きい場合、検索では中央の要素までのより小さい値を分析し、比較および照合を行います。

二分探索アルゴリズム(擬似コード)

二分探索は、短い反復ルーチンとして記述できます。このルーチンは、lowとhighという2つのポインタを保持し、ターゲットが見つかるか範囲が空になるまで範囲を絞り込んでいきます。

binarySearch(array, target)
    low = 0
    high = length(array) - 1
    while low <= high
        mid = (low + high) / 2      // floor value
        if array[mid] == target
            return mid
        else if array[mid] < target
            low = mid + 1
        else
            high = mid - 1
    return -1              // target not found

このルーチンは、成功した場合は対象のインデックスを返し、値が存在しない場合は -1 を返します。範囲はパスごとに半分になるため、ループは最大で log₂(n) 回実行されます。

二分探索の例

辞書の例を見てみましょう。特定の単語を探す必要がある場合、各単語を順番に調べるのではなく、最も近い単語をランダムに探して必要な単語を検索します。

二分探索の例

上の画像は、次のことを示しています。

  1. 10 桁の配列があり、要素 59 を見つける必要があります。
  2. すべての要素には、0から9までのインデックスが付けられています。次に、配列の中央値を計算します。そのためには、インデックスの左端と右端の値を取り、それらを2で割ります。結果は4.5ですが、切り捨て値を使用します。したがって、中央値は4です。
  3. このアルゴリズムは、中央(4)から最小値までのすべての要素を削除します。なぜなら、59は24より大きいからです。その結果、配列には5つの要素だけが残ります。
  4. さて、59は45より大きく、63より小さい。中央値は7である。したがって、右インデックス値は中央値-1となり、6となる。左インデックス値は以前と同じ5のままである。
  5. この時点で、59 の後に 45 が来ることがわかります。したがって、左側のインデックス (5) も Mid になります。
  6. これらの繰り返しは、配列が XNUMX つの要素のみに減らされるか、検索される項目が配列の中央になるまで続きます。

二分探索の仕組みを理解するために、次の例を見てみましょう。

二分探索の例

  1. 2 ~ 20 の範囲で並べ替えられた値の配列があり、18 を見つける必要があります。
  2. 下限値と上限値の平均は (l + r) / 2 = 4 です。検索対象の値は中間値である 4 よりも大きいです。
  3. 配列の値が中央値より小さい場合は検索対象から除外され、中央値である4より大きい値が検索対象となります。
  4. これは、実際の検索対象が見つかるまで繰り返し分割されるプロセスです。

なぜ二分探索が必要なのでしょうか?

バイナリサーチを検索アルゴリズムとして使用するのに適した理由は以下のとおりです。

  • 二分探索は、データのサイズに関係なく、ソート済みのデータに対して効率的に機能します。
  • データを順番に調べて検索を実行する代わりに、バイナリ アルゴリズムはデータにランダムにアクセスして必要な要素を見つけます。 これにより、検索サイクルが短縮され、より正確になります。
  • 二分探索は、等価比較を用いるのではなく、順序付けの原則に基づいてソートされたデータの比較を行います。等価比較は処理速度が遅く、ほとんどの場合不正確です。
  • アルゴリズムは、検索の各サイクル後、配列のサイズを半分に分割します。そのため、次の反復処理では、残りの半分の配列のみを処理することになります。

次のチュートリアルでは、 線形探索: Python, C++ 例:.

二分探索と線形探索の比較

コレクション内の値を検索する最も一般的な方法は、二分探索と線形探索の2つです。以下の表は、これらの違いをまとめたものです。

側面 バイナリ検索 線形検索
データ要件 ソートされたデータが必要です ソート済みデータと未ソートデータの両方に対応
方法 探索範囲を段階的に半分にする 各要素を順番にチェックします
時間の複雑さ O(log n) O(N)
ベスト 大規模でソート済みのデータセット 小規模または未分類のデータセット

要するに、二分探索は大規模でソート済みのデータに対してははるかに高速ですが、線形探索はより単純で、データがソートされていない場合は唯一の選択肢となります。

よくあるご質問

二分探索は、AIシステムの背後にあるソート済み構造における高速な検索を可能にします。例えば、閾値の検出、ハイパーパラメータの範囲調整、埋め込みのソート済みインデックス内の値の検索などが挙げられます。そのO(log n)の速度により、これらの検索は効率的に行われます。

はい。AIアシスタントは反復または再帰的な二分探索を記述できます。 Python, Javaまたは C++ 平易な説明から始めましょう。中央のインデックスを計算する際に、よくあるオフバイワンやオーバーフローのバグに注意し、エッジケースもテストしてください。

二分探索は、比較のたびに探索範囲を半分にするため、実行時間はO(log n)です。空間計算量は、反復バージョンではO(1)、再帰バージョンではコールスタックのためO(log n)となります。

いいえ。二分探索は、どちらの半分を破棄するかを判断できるように、データがソートされていることを前提としています。ソートされていないデータの場合は、まずデータをソートするか、要素を順番にチェックする線形探索を使用する必要があります。