C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#で二分探索(バイナリサーチ)を実装する方法|仕組みと計算量を解説

二分探索とは

二分探索(バイナリサーチ)は、ソート済みの配列を対象とした高速な検索アルゴリズムです。探索したい値を配列の中央にある要素と比較し、一致しなかった場合は、その値が存在し得ない側の半分の領域を丸ごと除外します。この操作を残りの半分に対して繰り返すことで、効率よく目的の値を見つけ出します。

例えば、下図のような配列から「62」という値を探す場合を考えてみましょう。中央の要素との比較結果から、62が存在するのは右側の領域だけであることが分かるため、左半分は完全に除外され、以降は右半分のみが探索対象となります。

C#で二分探索(バイナリサーチ)を実装する方法|仕組みと計算量を解説

二分探索の計算量

二分探索における各ケースの計算量は以下の通りです。

最悪時間計算量O(log n)
最良時間計算量O(1)
平均時間計算量O(log n)
最悪空間計算量O(1)

データ件数が増えても探索回数は対数的にしか増加しないため、大量のデータを扱う場合でも非常に高速に動作するのが大きな特徴です。

C#での実装例

以下は、C#で二分探索を実装するサンプルコードです。

public static object BinarySearchDisplay(int[] arr, int key) {
    int minNum = 0;
    int maxNum = arr.Length - 1;

    while (minNum <= maxNum) {
        int mid = (minNum + maxNum) / 2;
        if (key == arr[mid]) {
            return ++mid;
        } else if (key < arr[mid]) {
            maxNum = mid - 1;
        } else {
            minNum = mid + 1;
        }
    }
    return "None";
}

このメソッドでは、まず探索範囲の最小インデックス minNum と最大インデックス maxNum を設定し、範囲が重ならなくなるまで次の手順を繰り返します。

  • 中央のインデックス mid を求める
  • 目的のキーが中央の要素と一致すれば、その位置を返す
  • キーが中央の要素より小さければ、探索範囲を左半分に絞る
  • キーが中央の要素より大きければ、探索範囲を右半分に絞る

最後まで見つからなかった場合は「None」を返します。なお、二分探索を正しく動作させるには、対象となる配列が必ず昇順にソートされている必要がある点に注意してください。

  1. C++で二分木を二分探索木(BST)へ変換する方法を解説

    二分木(Binary Tree)とは二分木とは、木構造の各ノードが最大で2つの子ノードを持つことができる特別な木構造です。これらの子ノードは、それぞれ「左の子ノード」と「右の子ノード」と呼ばれます。シンプルな二分木の例は以下の通りです。二分探索木(BST)とは二分探索木(BST)は、以下のルールに従う特別な木構造です。左の子ノードの値は、常に親ノードの値より小さい右の子ノードの値は、常に親ノードの値より大きいすべてのノードが、それぞれ独立して二分探索木の性質を満たす二分探索木(BST)の例は以下の通りです。二分探索木は、検索や最小値・最大値の探索といった操作の計算量を削減するために用いられるデ

  2. C++プログラムにおける二分探索(バイナリサーチ)の基本と実装

    二分探索(バイナリサーチ)とは二分探索は「半区間探索」「対数探索」「バイナリチョップ」とも呼ばれる検索アルゴリズムで、ソート済みの配列の中から目的の値が存在する位置を効率的に見つけ出します。基本的な仕組みは非常にシンプルです。まず、探したい値(ターゲット値)を配列の中央の要素と比較します。一致しなかった場合は、ターゲット値が存在し得ない半分を丸ごと排除し、残りの半分に対して同様の比較を繰り返します。この「中央との比較」と「範囲の絞り込み」を続け、ターゲット値が見つかるか、検索範囲が空になる(=配列にその値が存在しない)かのどちらかで処理が終了します。アイデア自体は簡単ですが、正しく実装するには