Java 二分探索の反復的および再帰的
- 反復二分探索アルゴリズム
- 二分探索のための Java 反復プログラム
- 再帰的二分探索アルゴリズム
- 二分探索のための Java 再帰プログラム
- 
          
            Arrays.binarySearch()概要
- 二分探索のための Java プログラム
 
反復二分探索アルゴリズム
ここでは、n の要素を含むソートされていない配列 A[] があると仮定して、要素 X を見つけたいとします。
- 
loを0とし、hiをn - 1とする。
- 
lo<hiの間:- mid=- lo + (hi - lo)/2とします。
- A[mid] == Xの場合は、要素が見つかったのでインデックス- midを返します。
- A[mid] < Xの場合は、左半分の要素を破棄して- loを- mid+1とします。
- そうでない場合は、A[mid] > Xの場合は、右半分の要素を破棄してhiをmid-1とします。
 
- 
要素が見つからないので-1を返す。
二分探索のための Java 反復プログラム
class BinarySearch {
  int binarySearch(int arr[], int x) {
    int lo = 0, hi = arr.length - 1;
    while (lo <= hi) {
      int mid = lo + (hi - lo) / 2;
      if (arr[mid] == x)
        return mid;
      if (arr[mid] < x)
        lo = mid + 1;
      else
        hi = mid - 1;
    }
    return -1;
  }
  public static void main(String args[]) {
    BinarySearch ob = new BinarySearch();
    int arr[] = {1, 2, 3, 4, 5};
    int n = arr.length;
    int x = 5;
    int position = ob.binarySearch(arr, x);
    if (position == -1)
      System.out.println("Element not present");
    else
      System.out.println("Element found at index: " + position);
  }
}
出力:
Element found at index: 4
再帰的二分探索アルゴリズム
ここでは、n 個の要素を含むソートされていない配列 A[] があり、その中から X 個の要素を見つけたいとします。
- 
loを0、hiをn-1として初期化する。
- 
lo>hiの場合は、配列の探索空間を使い切ったことになるので、-1 を返す。
- 
中間点midをlo+(hi-lo)/2として計算する。配列を 2つに分割します。下半分の0からmid - 1までの要素を持つ配列と、上半分のmidからn - 1までの要素を持つ配列です。
- 
X==midならば、対象となる要素が見つかったことになります。
- 
Xがmidよりも小さい場合は、binarysearch(arr, lo, mid-1)を再帰的に呼び出して配列の下半分を検索する。
- 
それ以外の場合、Xがmidより大きい場合は、binarysearch(arr, mid+1, hi)を再帰的に呼び出して配列の上半分を検索する。
二分探索のための Java 再帰プログラム
class BinarySearch {
  int binarySearch(int arr[], int lo, int hi, int x) {
    if (hi >= lo && lo < arr.length - 1) {
      int mid = lo + (hi - lo) / 2;
      if (arr[mid] == x)
        return mid;
      if (arr[mid] > x)
        return binarySearch(arr, lo, mid - 1, x);
      return binarySearch(arr, mid + 1, hi, x);
    }
    return -1;
  }
  public static void main(String args[]) {
    BinarySearch ob = new BinarySearch();
    int arr[] = {1, 2, 3, 4, 5};
    int n = arr.length;
    int x = 2;
    int position = ob.binarySearch(arr, 0, n - 1, x);
    if (position == -1)
      System.out.println("Element not found !!!");
    else
      System.out.println("Element found at index: " + position);
  }
}
出力:
Element found at index: 1
Arrays.binarySearch() 概要
Java はすぐに使える関数 Arrays.binarySearch() を提供してくれるので、自分で関数を実装する必要はありません。この関数は非常に使いやすく効率的に実装されており、エラーになることもありません。
構文
public static int binarySearch(T arr, T key)
T は以下のいずれかになります。int、float、short、long、byte、char、double, さらにはユーザ定義の Object を指定することもできます。
実装されている二分探索と同様に、配列をソートする必要があります。二分探索アルゴリズムを用いて配列を検索し、対象となる要素のインデックスを見つけます。対象となる要素が複数存在する場合は、そのうちのいずれかの要素のインデックスを返します。
パラメータ
| Arr | 入力配列 | 
| Key | 検索対象の要素。 | 
戻り値
対象となる要素が見つかった場合はそのインデックスを返します。それ以外の場合は beg - 1 を返します。ここで、beg は配列検索スペースの開始インデックスです。
二分探索のための Java プログラム
import java.util.Arrays;
class BinarySearchExample {
  public static void main(String args[]) {
    int arr[] = {1, 2, 3, 4, 5};
    int key = 2;
    int result = Arrays.binarySearch(arr, key);
    if (result < 0)
      System.out.println("Element is not found!");
    else
      System.out.println("Element is found at index: " + result);
  }
}
出力:
Element is found at index: 1
Harshit Jindal has done his Bachelors in Computer Science Engineering(2021) from DTU. He has always been a problem solver and now turned that into his profession. Currently working at M365 Cloud Security team(Torus) on Cloud Security Services and Datacenter Buildout Automation.
LinkedIn