【詳細】Javaは二分探索(二分探索)を実装

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)です。

おすすめ

転載: blog.csdn.net/Sunshineoe/article/details/114883010