1.1で示した線形探索は言ってしまえばマシン
っぽいアルゴリズムである.
私たちは辞書を使うとき,一発で探したい単語の書かれているページを開けることは
めったにないが,もし違うページを開いてしまっても,探したい単語がそのページの
前にあるのか後ろにあるのかを理解することができる.
二分探索はその要領で探索すべきデータの範囲を少なくしていく(機械的に二分割
していく)ことで実装する.ただし,探索対象となる表はあらかじめ昇順に
並び替えられているとする.
二分探索は以下のコードのように実装することができる.
while(low <= high){
int middle = (low + high)/2;
int status = strcmp(key, data[middle].getKey());
if(key == 注目データ なら){
return mならdle;
}else if(key < 注目データ なら){
high = middle -1;
}else{
low = middle + 1;
}
}
import java.util.Arrays;
public class BinarySearch {
static int[] table = { 4, 2, 11, 4, 3, 2, 35, 3535, 353535 };
static int binarySearch(int key) {
int low = 0;
int high = table.length - 1;
while (low <= high) {
int middle = (low + high) / 2;
if (table[middle] == key) {
return middle;
} else if (table[middle] < key) {
low = middle + 1;
} else {
high = middle - 1;
}
}
return -1;
}
static void printArray() {
System.out.print("table = {");
for (int i = 0; i < table.length; i++) {
System.out.printf("%d", table[i]);
if (i != table.length - 1) {
System.out.printf(", ");
}
}
System.out.println("}");
}
public static void main(String[] args) {
Arrays.sort(table);
int key = 3535;
System.out.printf("key = %d\n",key);
printArray();
int index = binarySearch(key);
if (index != -1) {
System.out.printf("key == table[%d]", index);
} else {
System.out.println("could not find key(3535)");
}
}
}
$ java BinarySearch table = {2, 2, 3, 4, 4, 11, 35, 3535, 353535} key == table[7]