卒業生は就職活動のためにアルゴリズムを知っておく必要があります。バイナリ検索をステップバイステップで教えます

卒業生は就職活動のためにアルゴリズムを知っておく必要があります。バイナリ検索をステップバイステップで教えます

1. 二分探索の背景

配列またはコレクションに多数の要素が格納されている場合、特定の要素の位置または存在を追跡したい場合、従来の方法は、探している要素が見つかるまで各要素をループすることです。この検索方法は非常に非効率なので、検索効率を向上させるにはバイナリ検索が必要です。

2. 二分探索入門

指定された値の位置を見つけるための二分探索(半探索)

Baidu 百科事典では二分探索を次のように紹介しています。


3. 二分探索のアルゴリズムの考え方

配列が昇順でソートされていると仮定すると、指定されたターゲット値目標に対して、配列の中央から検索を開始します。1. 検索データが中央の要素値と正確に等しい場合は、中央の要素値のインデックスを返します。2. 検索値が中央の値より小さい場合は、検索範囲全体の前半を新しい検索範囲として使用します。3. 検索値が中央の値より大きい場合は、検索範囲全体の後半を新しい検索範囲として使用します。注: 検索が成功した場合はインデックスが返され、失敗した場合は -1 が返されます。

4. コードの実装

4.1 ループを使用して二分探索を実装する

  1. パブリッククラスBinarySearch {
  2. 公共 静的void main(String[] args) {
  3. // ランダム配列を生成する
  4. int [] 配列 = suiji();
  5. // ランダム配列をソートする
  6. 配列.sort(配列);
  7. System.out.println ( "生成さたランダム配列は次のとおりです:" + Arrays.toString(array));
  8.  
  9. System.out.println ( "検索する値:" );
  10. スキャナー入力 = new Scanner(System.in ) ;
  11. // 検索するターゲット値
  12. int目的 = input.nextInt();
  13.  
  14. // バイナリ検索を使用する
  15. 整数 インデックス= binarySearch(配列、目的);
  16. System.out.println ( "検索対象の値のインデックス位置:" + index );
  17.  
  18. }
  19.  
  20. /**
  21. * ランダム配列を生成する
  22. *
  23. * @return戻り値、ランダムな配列を返す
  24. */
  25. プライベートスタティック  int [] スイジ() {
  26. // random.nextInt(n)+m は m から m+n-1 の間の乱数を返します
  27. int n = 新しいRandom().nextInt(6) + 5;
  28. int [] 配列 = 新しいint [n];
  29. // 配列をループして値を割り当てる
  30. ( int i = 0; i < 配列の長さ; i++) {
  31. 配列[i] = 新しいRandom().nextInt(100);
  32. }
  33. 配列を返します
  34. }
  35.  
  36. /**
  37. * 二分探索--- ループで実装 
  38. *
  39. * @param array 検索する配列
  40. * @param aim 探す値
  41. * @return戻り値、成功した場合はインデックスを返し、失敗した場合は -1 を返します
  42. */
  43. プライベートスタティック  intバイナリサーチ( int [] 配列, int目的) {
  44. // 配列の最小インデックス値
  45. 整数 = 0;
  46. // 配列の最大インデックス値
  47. 整数 = 配列の長さ - 1;
  48. 整数中間;
  49. <=){
  50. 中央 = (+) / 2;
  51. // 検索値が中央値より小さい場合、検索範囲全体の前半が新しい検索範囲として使用されます
  52. if (目的 < 配列[mid]) {
  53. = 中央 - 1;
  54. // 検索値が中央値より大きい場合、検索範囲全体の後半部分が新しい検索範囲として使用されます
  55. }そうでない場合 (aim > array[mid]) {
  56. = 中央 + 1;
  57. // 検索されたデータが中央の要素の値と完全に等しい場合は、中央の要素の値のインデックスを戻します
  58. }それ以外{
  59. ミッドに戻ります
  60. }
  61. }
  62. -1 を返します
  63. }
  64. }

コード実行結果:

  1. 生成されたランダム配列は次の通りです: [16, 33, 40, 46, 57, 63, 65, 71, 85]
  2. 検索する値:
  3. 46
  4. 検索する値のインデックス位置: 3

入力値が見つからない場合は -1 が返されます。

  1. 生成されたランダム配列は次の通りです: [28, 41, 47, 56, 70, 81, 85, 88, 95]
  2. 検索する値:
  3. 66
  4. 検索する値のインデックス位置: -1

4.2 再帰を用いた二分探索の実装

  1. パブリッククラスBinarySearch2 {
  2. 公共 静的void main(String[] args) {
  3. // ランダム配列を生成する
  4. int [] 配列 = suiji();
  5. // ランダム配列をソートする
  6. 配列.sort(配列);
  7. System.out.println ( "生成さたランダム配列は次のとおりです:" + Arrays.toString(array));
  8.  
  9. System.out.println ( "検索する値:" );
  10. スキャナー入力 = new Scanner(System.in ) ;
  11. // 検索するターゲット値
  12. int目的 = input.nextInt();
  13.  
  14. // バイナリ検索を使用する
  15. 整数 インデックス= binarySearch(配列、目標、0、配列の長さ - 1);
  16. System.out.println ( "検索対象の値のインデックス位置:" + index );
  17. }
  18.  
  19. /**
  20. * ランダム配列を生成する
  21. *
  22. * @return戻り値、ランダムな配列を返す
  23. */
  24. プライベートスタティック  int [] スイジ() {
  25. // Random.nextInt(n)+m は m から m+n-1 の間の乱数を返します
  26. int n = 新しいRandom().nextInt(6) + 5;
  27. int [] 配列 = 新しいint [n];
  28. // 配列をループして値を割り当てる
  29. ( int i = 0; i < 配列の長さ; i++) {
  30. 配列[i] = 新しいRandom().nextInt(100);
  31. }
  32. 配列を返します
  33. }
  34.  
  35. /**
  36. * 二分探索--- 再帰法 
  37. *
  38. * @param array 検索する配列
  39. * @param aim 探す値
  40. * @param left左の最小値
  41. * @param right右側の最大値
  42. * @return戻り値、成功した場合はインデックスを返し、失敗した場合は -1 を返します
  43. */
  44. プライベートスタティック  int binarySearch( int [] 配列, int目的, int   int  ) {
  45. if (目標 < 配列[] || 目標 > 配列[]) {
  46. -1 を返します
  47. }
  48. // 中間の値を見つける
  49. int中央 = (+) / 2;
  50. (配列[mid] == 目標)の場合{
  51. ミッドに戻ります
  52. }そうでない場合 (配列[mid] > 目標) {
  53. //中央の値が検索する値より大きい場合は、左半分から再帰的に続行します
  54. binarySearch(配列、aim、 left 、mid - 1)を返します
  55. }それ以外{
  56. // 中央の値が検索する値より小さい場合は、右半分から再帰的に続行します
  57. binarySearch(配列、aim、mid + 1、配列.length-1)を返します
  58. }
  59. }
  60. }

ループと比較すると、再帰のコードはシンプルですが、より多くの時間とスペースを消費し、効率も低くなります。実際の勉強や仕事では、状況に応じて使い分けてください。

<<:  AI および機械学習プロジェクトはどの程度安全ですか?

>>:  機械学習情報工場になるためには、企業はリーン製造からこれらの6つの基本を学ぶ必要がある

推薦する

...

...

...

...

2024 年の世界のデジタルビジネスに関するトップ 10 の予測

この記事では、今後 12 ~ 24 か月の間にグローバル ビジネス エコシステムを変革する外部要因と...

AIによる売上予測により、組織は不確実性の中でコントロールを獲得できる

AI を活用した販売は、新型コロナウイルス感染症のパンデミックによってもたらされた不確実性に多くの組...

...

...

...

ビッグデータの機械理解の秘密:クラスタリングアルゴリズムの詳細な説明

この記事では、いくつかのクラスタリング アルゴリズムの基本的な概要を示し、シンプルでありながら詳細な...

ソフトウェアとハ​​ードウェアを組み合わせたCDS Shouyun AIクラウドサービスの技術実践

人工知能は新たな変化を先導しています。近年、人工知能はテクノロジー業界から始まり、急速に生活の各分野...

2020年第1四半期の人工知能の最新進歩

かつてはSFの世界であり、コンピューティングの世界の非現実的な夢であった人工知能が、今や現実のものと...

...