Javaアルゴリズム探訪:二分探索の詳しい解説

二分探索は、順序付けされた配列内の特定の要素を見つける必要がある場合に効率的なアルゴリズムです。時間計算量は O(log n) であり、線形探索の O(n) に比べて、二分探索は探索効率を大幅に向上させることができます。この記事では、二分探索とは何か、またそれを Java で実装する方法について詳しく説明します。

二分探索の概要

二分探索とも呼ばれる二分探索は、順序付けされた配列内のターゲット要素を見つけるためのアルゴリズムです。その原理は、目的の要素が見つかるか、目的の要素が存在しないと判断されるまで、探索範囲を半分に減らし続けることです。二分探索の手順は次のとおりです。

  1. 左境界 left を配列の最初の要素のインデックスになるように初期化し、右境界 right を配列の最後の要素のインデックスになるように初期化します。
  2. 中央の要素のインデックス Mid を計算します。これは、(left + right) / 2 に等しくなります。
  3. 中間要素をターゲット要素と比較します。
  • 中間要素がターゲット要素と等しい場合、ターゲットが見つかり、中間要素のインデックスが返されます。
  • 中央の要素がターゲット要素より大きい場合は、右側の境界をmid - 1に更新し、左半分の検索を続けます。
  • 中央の要素がターゲット要素より小さい場合は、左側の境界を Mid + 1 に更新し、右半分の検索を続けます。
  1. ターゲット要素が見つかるか、左側の境界が右側の境界を超えるまで、手順 2 と 3 を繰り返します。

Javaは二分探索を実装します

以下は、Java でバイナリ検索を実装するサンプル コードです。

/**
 * 二分查找
 */
public static int binarySearch(int[] intArr,int key){
    
    
    int left = 0;
    int right = intArr.length -1;

    while(left <= right){
    
    
        //计算中间元素的索引
        int mid = (left + right) >>> 1;
        //获取中间元素的值
        int midVal = intArr[mid];
        //比较中间元素和目标元素的值
        //如果中间元素小于目标元素,则将左边界更新为 mid + 1,继续在右半边查找。
        if (midVal < key)
            left = mid + 1;
        //如果中间元素大于目标元素,则将右边界更新为 mid - 1,继续在左半边查找。
        else if (midVal > key)
            right = mid - 1;
        //如果中间元素等于目标元素,则找到目标,返回中间元素的索引。
        else
            return mid;
    }

    //如果循环结束仍未找到目标元素,返回一个负数,表示未找到,通常为-(left + 1)
    return -(left + 1);
}

public static void main(String[] args) {
    
    

    int[] intArray = new int[]{
    
    2,4,5,7,9,11,16,23,45,67};

    System.out.println(binarySearch(intArray,5));
    System.out.println(binarySearch(intArray,23));
    System.out.println(binarySearch(intArray,1));
    System.out.println(binarySearch(intArray,20));
    System.out.println(binarySearch(intArray,110));

}

出力は次のとおりです。

2
7
-1
-8
-11

上記のコードでは、binarySearch メソッドは、順序付けされた配列 intArr とターゲット要素キーをパラメーターとして受け取り、バイナリ検索アルゴリズムを使用して配列内のターゲット要素のインデックスを見つけます。ターゲット要素が見つかった場合はそのインデックスが返され、それ以外の場合はターゲット要素が存在しないことを示す負の数が返されます。

予防

二分探索の前提は、配列が順序付けされている必要があるということです。そうしないと、正しく機能しません。配列がソートされていない場合は、二分探索アルゴリズムを使用する前に配列をソートする必要があります。

要約する

二分探索は、順序付けされた配列に適した効率的な検索アルゴリズムです。その時間計算量は O(log n) です。ここで、n は配列の長さです。反復ごとに検索範囲が半分になるため、特に大規模な順序配列の場合、線形検索などの単純な検索アルゴリズムよりも効率的です。二分探索アルゴリズムを注意深く実装して理解することで、それを Java に簡単に適用して、さまざまな検索問題を解決できます。

おすすめ

転載: blog.csdn.net/weixin_44002151/article/details/132822775