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

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

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

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

データ分析と機械学習のための 11 の高度な視覚化

視覚化は、複雑なデータ パターンと関係性を直感的でわかりやすい方法で伝えるための強力なツールです。こ...

機械学習における 5 つのよくある問題点とその解決方法

[[394332]]機械学習のさまざまな使用例について聞いたことがあるかもしれません。たとえば、カン...

最新のClaude2.1とLlama 2をご利用いただけます。アマゾンが生成型AI開発の参入障壁を下げる

良いニュースです。生成 AI アプリケーションの敷居が大幅に下がりました。先ほど、Amazon We...

エッジコンピューティングと人工知能について知っておくべき7つのこと

エッジ コンピューティングと AI はどのように連携するのでしょうか? エッジ コンピューティングが...

百度の商用グレードの無人バス「アポロ」が一般公開され、試乗が可能に

百度は第1回デジタルチャイナサミットで、中国の商用グレードの無人バス「アポロ」の試乗を一般公開すると...

...

ナレッジグラフと AIGC を組み合わせるにはどうすればよいでしょうか? JD.comがやっていること

I.はじめにまず、JD.com による電子商取引シナリオにおける AIGC の調査について紹介します...

...

...

...

GPT-3: 高く評価されている交通の星ですが、大きな欠陥があり、非常に危険です...

昨年、最も人気があったトラフィックスターはGPT-3でした。GPT-3は質問に答えたり、記事を書いた...

...

機械学習を妨害する10のサイバー攻撃

サーセイ・ラニスターの策略やサー・ジョラー・モーモントの父親のような保護をもってしても、攻撃者が H...

完璧な意思決定ツリーを作成する方法

[51CTO.com クイック翻訳] ご存知のとおり、決定木は実生活で多くの実用的なシナリオで利用さ...

エネルギーの未来: 仮想発電所はエネルギー転換を加速できるか?

コペルニクス気候変動サービスによると、2023年は記録上最も暖かい年となっただけでなく、世界の平均表...