・バイナリサーチとは
バイナリサーチとは、効率的な値の検索をすることのできる手法の一つです。その方法ははデータを半分に分けて調べます。例えば11個のデータがある場合、6番目が中央に当たる値です。ここを起点に①中央に当たる値と同じとき、②中央より小さいとき、③中央寄り大きい時の3段階に分け、値を探していく方法です。これを使う際の注意点としては値が整列されることが求められる点です。・具体的な方法
・アルゴリズムのイメージ
中央値と探したい値を比較=>同じなら終了
=>探したい値が大きい=中央値より右を探す
=>探したい値が小さい=中央値より左を探す
・具体的な手順
①用意する変数・データ探したい値
データの配列
探すデータの左端を指す値
探すデータの右端を指す値
データの中央値
検索結果
②手順
- 中央値と探したい値の比較し、大きさの結果を出す
- 大きいのなら探す範囲を中央値より右にする=中央値+1~配列のサイズ分のデータの探索
小さいのなら探す範囲を配列の初め~中央値-1にする - ループ文で比較をして結果を出す
③Javaで書いてみると
バイナリサーチ.java
import java.util.Scanner;
public class BinarySearch {
public static void main(String[] args) {
int[] data = {2, 3, 4, 5, 6, 8, 10, 12, 19, 20, 30};
Scanner sc = new Scanner(System.in);
//探したい値
int searchValue = sc.nextInt();
//結果を入れる、-1なら見つからなかったという意味
int findID = -1;
//探す左端の値
int left = 0;
//探す右端の値(配列は0から始まるので配列の大きさから1を引く(length-1をする))
int right = data.length - 1;
//探す値が無くなると終了=>どちらかが追い付けば終了
while(left <= right) {
//中央値
int middle = (left + right) / 2;
if(data[middle] == searchValue) {
findID = middle;
break;
} else if (data[middle] < searchValue) {
left = middle + 1;
} else {
right = middle - 1;
}
}
if(findID == -1) {
System.out.println("値は見つかりませんでした。");
} else {
System.out.println("値は配列の"+findID + "番目にあります。");
}
}
}