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

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

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つの基本を学ぶ必要がある

ブログ    
ブログ    
ブログ    

推薦する

AIの5つの本当の危険性

偽造品、アルゴリズムの偏り、その他の問題が私たちの日常生活に及ぼす影響[[323166]]過去数年間...

文化分野における人工知能の応用

近年、我が国の文化産業は人工知能などのハイテクをますます重視しており、文化と技術が深く有機的に融合す...

中国の科学者が色を変えることができる柔らかいロボットを開発

ああ、これはまだ私が知っているロボットですか? 「カモフラージュして色を変える」と「柔らかく変形する...

...

...

...

...

偉大な人物が学界に復帰:何開明氏がMITへの入学を発表

「FAIR研究科学者として、私は2024年にMITのEECS教授陣に加わります。」 AI分野の著名な...

製造業におけるロボット:脅威か、それともチャンスか?

過去10年間で製造業におけるロボットの使用が増加しています。先進オートメーション協会が最近発表した調...

ビッグデータと機械学習は世界のエネルギー業界をどのように変えるのでしょうか?

機械学習、ビッグデータ、自動化は世界の産業システムに革命をもたらしており、エネルギー業界も例外ではあ...

2019 年に CIO が AI 導入をリードできる 5 つの方法

[[261760]]詳細な宿題のレビューからバックオフィスの自動化まで、AI の進歩は今後 1 年間...

米国版「テンセントがアプリのアップデートを停止」、米国が「AIアルゴリズム」を法制化、未審査の公開を禁止

数日前、テンセントの製品に違反があり、合計4回に分けて報告されました。工業情報化部はテンセントに対し...

ChatGPT で質問するときによくある誤解 10 選

諺にもあるように、良い質問は良い答えにつながります。特に GPT を使用するユーザーにとって、質問の...

次世代の顔認識技術とは何でしょうか?ここを見て

アクセス制御業界における顔認識の需要の高まりに応えて、このコンセプトをより高い技術レベルで拡張する新...

AIは脳の信号をリアルタイムで解釈し、画像の主要な視覚的特徴を7倍の速度で復元するとルカン氏は述べた。

AIが脳の信号をリアルタイムで解釈できるようになりました!これはセンセーショナルなことではありませ...