Java プログラミング スキル - データ構造とアルゴリズム「非再帰的バイナリ検索」

Java プログラミング スキル - データ構造とアルゴリズム「非再帰的バイナリ検索」

[[396063]]

基本的な紹介

1. バイナリ検索は、順序付けられたシリーズ(数字や文字など)の検索にのみ適用できます。検索する前にシリーズを並べ替えてください。

2. バイナリ検索法の実行時間は対数時間 O(log2n) です。つまり、必要なターゲット位置を見つけるのに最大で log2n ステップしかかかりません。ターゲット番号 30 がキュー [0,99] から見つかったと仮定すると、必要な検索ステップ数は log2(100) です。つまり、最大で 7 回かかります (2^6<100<2^7)。

コード例

  1. パッケージ com.xie.algorithm;
  2.  
  3. パブリッククラス BinarySearchNoRecur {
  4. 公共 静的void main(String[] args) {
  5. int [] arr = {1, 3, 8, 10, 11, 67, 100};
  6. 整数 インデックス= binarySearch(arr, 1);
  7. システム.out.println ( "index = " + index );
  8. }
  9.  
  10. /**
  11. * 二分探索の非再帰実装
  12. *
  13. * @param arr 検索する配列。arrは昇順です
  14. * @param target 検索する番号
  15. * @returnは対応するインデックスを返します。-1は見つからないことを意味します。
  16. */
  17. 公共 静的  intバイナリサーチ( int [] arr, intターゲット) {
  18. 整数 = 0;
  19. 整数 = arr.length - 1;
  20. <=){
  21. int中央 = (+) / 2;
  22. (arr[mid] == ターゲット)の場合{
  23. ミッドに戻ります
  24. }そうでなければ(arr[mid] > target) {
  25. //左に検索する必要がある
  26. = 中央 - 1;
  27.  
  28. }それ以外{
  29. // 右方向に検索する必要があります。
  30. = 中央 + 1;
  31. }
  32. }
  33. -1 を返します
  34. }
  35. }

基本的な紹介

1. 補間検索アルゴリズムはバイナリ検索に似ていますが、補間検索が毎回適応中間点から開始される点が異なります。

2. バイナリ検索で中間インデックスを見つけるための式は、補間検索中間インデックス式に変換されます。ここで、low は左側のインデックスを表し、high は右側のインデックスを表し、key は検索する値を表します。

コード例

  1. パッケージ com.xie.search;
  2.  
  3. java.util.ArrayList をインポートします。
  4. java.util.List をインポートします。
  5.  
  6. パブリッククラス InsertValueSearch {
  7. 静的 整数 カウント= 0;
  8.  
  9. 公共 静的void main(String[] args) {
  10. int [] arr = 新しいint [102];
  11. ar[0] = 1;
  12. ar[1] = 1;
  13. ( int i = 2; i < 102; i++) {
  14. arr[i] = i;
  15. }
  16. リスト<整数> indexList = insertValueSearch(arr, 0, arr.length - 1, 1);
  17. システム.out.println ( "indexList = " + indexList);
  18. System.out.println ( "検索数:" + count );
  19.  
  20. /*
  21. インデックスリスト = [1, 0]
  22. 検索数: 1
  23. */
  24. }
  25.  
  26. /**
  27. * 補間検索、インデックスコレクションを返す
  28. *
  29. * @param arr 配列
  30. * @param left左インデックス
  31. * @param right右インデックス
  32. * @param findValue 検索する値
  33. * @return見つかった場合はすべてのインデックスのコレクションを返し、見つからない場合は空を返します
  34. */
  35. 公共 静的リスト<整数> insertValueSearch( int [] arr, int   int   int findValue) {
  36. カウント++;
  37. リスト<整数> indexList = 新しい ArrayList<整数>();
  38. //注意: findValue < arr[0] || findValue > arr[arr.length - 1] が必要です。そうでない場合、mid が範囲外になる可能性があります。
  39. if (>|| findValue < arr[0] || findValue > arr[arr.length - 1]) {
  40. 新しいArrayList<Integer> ( )を返します
  41. }
  42. int mid = left + ( right - left ) * (findValue - arr[ left ]) / (arr[ right ] - arr[ left ]);
  43. int midValue = arr[mid];
  44.  
  45. (findValue > midValue)の場合{
  46. insertValueSearch(arr, mid + 1, right , findValue)を返します
  47. }そうでない場合 (findValue < midValue) {
  48. insertValueSearch(arr, left , mid - 1, findValue)を返します
  49. }それ以外{
  50. //見つかった場合は左にスキャンし、条件を満たすものをindexListに追加します
  51. 整数 温度= 中間 - 1;
  52. )の間{
  53. if ( temp < 0 || arr[ temp ] != findValue) {
  54. 壊す;
  55. }
  56. indexList.add ( temp ) ;
  57. 温度--;  
  58. }
  59.  
  60. // 再び右にスキャンし、条件を満たすものをindexListに追加します
  61. 温度= 中間 + 1;
  62. )の間{
  63. if ( temp > right || arr[ temp ] != findValue) {
  64. 壊す;
  65. }
  66. indexList.add ( temp ) ;
  67. 一時++;
  68. }
  69. インデックスリストを追加します(mid);
  70. indexListを返します
  71. }
  72. }
  73. }

予防

  1. データ量が多く、キーワードの分布が比較的均一なルックアップ テーブルの場合、補間検索の方が高速になります。
  2. キーワードの分布が不均一な場合、この方法は必ずしもバイナリ検索法よりも優れているとは限りません。

<<:  機械学習モデルの品質を保証し、その有効性を評価する方法

>>:  AIを活用して食材を分析し、より適切な栄養バランスを実現しましょう!

ブログ    

推薦する

ロボット工学が産業界のデジタル革命を推進

近年、自動化プロセスの導入は世界中で加速しています。生産効率の大幅な向上により、低技能労働者の代わり...

製造業における人工知能の8つの応用シナリオ

スマート製造ブームの到来により、設計、生産、管理、サービスなど、製造業のあらゆる側面に人工知能アプリ...

子どもたちが将来のスタートラインで勝てるようにするには:人工知能の思考を学ぶ

今日は、子供たちにプログラミングを教えるということについての私たちの考えをいくつか共有したいと思いま...

ウォルマートのAIを活用したイノベーションの実践経験

ウォルマートの創業者サム・ウォルトンはよく「私たちの人材が違いを生み出す」と言っていましたが、この言...

Google の Bard チャットボットがアップデートされ、リアルタイムで応答を生成できるようになりました

10 月 29 日現在、大規模言語モデル (LLM) では即座に回答を出すことができないため、質問を...

毎日のアルゴリズム: 回転マトリックス

[[431855]]各ピクセルのサイズが 4 バイトである N × N 行列で表される画像が与えられ...

ニューヨーク市の AI イニシアチブを分析: そこから何を学べるか?

エリック・アダムス市長は最近、ニューヨーク市政府がAI技術の応用を推進する計画を発表した。この計画に...

...

音声認識が検索ボックスに取って代わり、人工知能が3つの主要な応用分野で主導権を握る

マイクロソフトのレドモンド研究所の副社長であるデュメイス氏は、ディープラーニング技術が2017年にオ...

...

自動運転列車が完成しました!しかし、あなたは座る勇気がありますか?

すべてが計画通りに進めば、鉱山大手リオ・ティントの貨物列車が8月にコロラド州プエブロ近郊の線路を走り...

...

...