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

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

推薦する

[ディープラーニングシリーズ] PaddlePaddleとTensorflowでGoogLeNet InceptionV2/V3/V4を実装する

前回の記事では、GoogLeNet InceptionV1のネットワーク構造を紹介しました。この記事...

...

人工知能:「全能」ではない

[[391544]]私の国の人工知能の研究と応用は世界でも比較的進んでいます。メディアは、中国はこの...

もし人工知能が人類をリードし、他の惑星で発展したら、その人工知能は人類を支配することになるのでしょうか?

科学者たちは長期にわたる調査により、人類文明の進歩が指数関数的な上昇傾向を示していることを発見した。...

機械学習の再考: 人工知能はどのようにして「記憶を失う」ことを学ぶのか?

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

アルゴリズムを視覚化するオープンソース プロジェクトをお勧めします。

誰もが知っているように、アルゴリズムを学ぶことは、コンピューターサイエンスの中で最も退屈でわかりにく...

Baidu Create 2018 ディープラーニング フロンティア テクノロジーと産業応用公開コースのハイライト

[51CTO.com からのオリジナル記事] 中国の開発者が集まる毎年恒例の盛大な集まりである Ba...

会話型 AI でビジネス成果を向上させる 5 つの方法

[[379724]]良好なコミュニケーションはビジネスを推進し、組織に戦略的に実装された人工知能 (...

...

...

ChatGPT は EDR 検出を回避する変異型マルウェアを作成します

ChatGPTは昨年末のリリース以来、世界中で大きな話題を呼んでいます。しかし、消費者やIT専門家の...

...

キング・オブ・グローリーのプレイからサッカーのプレイまで、テンセントのAIが再び進化

テンセントは12月30日、同社の人工知能チームが第1回Google Football Kaggleコ...