1.考えの概要
二分探索は二分探索とも呼ばれ、比較回数が少なく検索速度が速いという利点がありますが、検索する順序が正しい必要があります。昇順のデータコレクションの場合、最初に昇順のコレクションで中央の要素を見つけ、データコレクションを2つのサブセットに分割し、中央の要素をキーと比較して、キーと等しいかどうかを返します。キーよりも大きい場合は、前のデータセットを検索します。それ以外の場合は、見つかるまで後者のサブセットを検索します。見つからない場合は、-1を返します。
2.アルゴリズムのアイデア
①最初に、検索間隔全体の中央位置を決定しますmid = low +(high-low)/ 2;
②チェックするキー値と中間位置のキー値を比較します。
それらが等しい場合、検索は成功します。
より大きい場合は、後半の領域で二分探索を続行します。
未満の場合は、前半領域で二分探索を続行します。
検索が成功した場合は、キーワードが配置されている配列のインデックスを返し、見つからない場合は-1を返します。
注:二分探索における中間値の計算:
これは古典的なトピックです。二分探索で中央値を計算する方法は?誰もが一般的に2つの計算方法を提供します:
- アルゴリズム1:
mid = (low + high) / 2
- アルゴリズム2:
mid = low + (high – low)/2
一見、アルゴリズム1は簡潔であり、アルゴリズム2が抽出された後は、アルゴリズム1と同じです。しかし実際には、違いがあります。アルゴリズム1の方法では、極端な場合、(低+高)がオーバーフローするリスクがあり、結果の途中で間違ってプログラムエラーが発生します。2番目のアルゴリズムは、計算されたmidがlowより大きく、highより小さい必要があり、オーバーフローの問題がないことを確認できます。
3.コードの実装
package com.it.select;
public class binarySearch {
public static void main(String[] args) {
int[] arr = {1,2,3,4,6,7,10};
int middle = binarySearch(10, arr, 0, arr.length-1);
System.out.println(arr[middle]);
}
// 返回的是要查询数组元素的下标
public static int binarySearch(int key,int[] array,int left,int right) {
if(key < array[left] || key > array[right] || left > right) {
return -1;
}
//取数组下标的中间值
int mid = left + (right - left)/2;
if(array[mid] > key) {
return binarySearch(key, array, left, mid-1);
}else if(array[mid] < key) {
return binarySearch(key, array, mid + 1, right);
}else {
return mid;
}
}
}
4.アルゴリズム分析
二分探索の時間計算量はO(log2n)です。