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