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

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

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

ブログ    
ブログ    

推薦する

人工知能が医師の「映画鑑賞」を支援:診断精度は95%を超える

[[233292]]最近、北京天壇病院は、世界初のCTおよびMRI神経画像人工知能支援診断製品「Bi...

指紋と顔の認識が手のひらスキャンにアップグレードされ、大ヒット映画でしか見られない新技術がシティエキスポでデビュー

[[250312]]手のひらをスワイプするだけで入場や支払いができ、道路清掃車にセンサーを追加するこ...

...

マイクロソフト、人間の編集者をAIに置き換え、ジャーナリスト数名を解雇

[[328414]]マイクロソフトは、マイクロソフトニュースとMSNチームから数十人のジャーナリスト...

3nmなのに歯磨き粉を絞ってるだけ? A17 Proの実行スコアが公開:CPUマルチコアはわずか3.6%向上

昨日Apple A17 Proが正式リリースされ、3nmプロセスを採用していますが、その性能はどのよ...

【WOT2018】AIの敷居は下がり続け、AIツールは誰でも利用可能に

[51CTO.comより引用] 2018年11月30日から12月1日まで、WOT2018グローバル人...

アジャイル開発が機械学習に役立つ5つの方法

[51CTO.com クイック翻訳] フレームワークと方法として、アジャイル開発は現在、ソフトウェア...

ディープラーニングを使って夢に現れる物体を分析する(完全版)

[[197493]]この記事の主な内容は機械学習と神経科学を組み合わせたものであり、読者にはこれら...

...

...

MetaMath: 逆思考で大規模モデルをトレーニングする新しい数学的推論言語モデル

複雑な数学的推論は、大規模言語モデルの推論能力を評価するための重要な指標です。現在、一般的に使用され...

NetEase Cloud Music 推奨システムのコールド スタート技術

1. 問題の背景: コールドスタートモデリングの必要性と重要性コンテンツプラットフォームとして、QQ...

中国のLMM体格に適したベンチマークであるCMMMUがここにあります:30以上のサブ分野、12Kの専門家レベルの質問

近年、大規模マルチモーダルモデル (LMM) の機能が向上したため、LMM のパフォーマンスを評価す...

...