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を活用して食材を分析し、より適切な栄養バランスを実現しましょう!

推薦する

ハン・ソン、チュー・ジュンヤンらがGAN圧縮方式を提案:計算電力消費は1/9以下、オープンソース化

GAN は大幅に圧縮することもできます。MIT ハン・ソン氏のチームによる最新の研究は、多くの研究者...

WSLはAIトレーニングタスクとLinux GUIアプリケーションの実行をサポートします

WSL は Windows 上で GPU を使用してアプリケーションを実行することをサポートするよう...

自動運転車と機械学習:交通の未来を変える

自動運転車と機械学習は、自動車業界に革命をもたらす画期的な技術として登場しました。人工知能 (AI)...

AI の透明性とは何ですか? また、なぜそれが必要なのですか?

AI テクノロジーを利用する組織はますます増えていますが、多くの企業はまだ AI テクノロジーの仕...

新たな AI の冬を回避するにはどうすればよいでしょうか?

人工知能はここ数年で大きな進歩を遂げてきましたが、開発者の過剰な約束とエンドユーザーの非現実的な期待...

MIT、失われた古代言語を解読するための新しい機械翻訳アルゴリズムを発表

MITのコンピュータ科学および人工知能研究所(CSAIL)の研究者らは、歴史から長い間失われていた古...

人工知能とコールセンターの衝突が新たな時代を創る

[[430158]]コールセンターは1960年代から存在しており、NASAのミッションコントロールで...

人工知能とサイバーセキュリティは諸刃の剣

[[379153]] [51CTO.com クイック翻訳] 研究によると、人工知能技術はさまざまな業...

...

必要なのはソースコードだけです! 7Bコードの小型モデルは同サイズでは無敵で、その性能はChatGPTやGoogle Geminiに匹敵する

「GitHub Copilot のようなコード補完ツールは、100 万人以上の開発者に使用されており...

人工知能はブロックチェーンにどのような影響を与えるのでしょうか?

人工知能 (AI) の開発には、機械による継続的な学習が伴います。コンピュータが「スマート」になるた...

Ruan Yifeng: ガウスぼかしアルゴリズム

通常、画像処理ソフトウェアには、画像にぼかし効果を加えるための「ぼかし」フィルターが用意されています...

...

趙傑:面接では(純粋な)アルゴリズムの質問が見られる

今朝、外出中に、タブレットでZuo Erduo Haoziの新しい記事「純粋アルゴリズムの面接の質問...

...