Java プログラミング スキル - データ構造とアルゴリズム「フィボナッチ検索」

Java プログラミング スキル - データ構造とアルゴリズム「フィボナッチ検索」

[[398011]]

基本的な紹介

  1. フィボナッチとは、線分を 2 つの部分に分割し、一方の長さと全体の長さの比率が、もう一方の部分とこの部分の比率と等しくなるようにすることです。最初の 3 桁のおおよその値は 0.618 です。この比率に従って設計された形状は非常に美しいため、黄金比、または中外比率とも呼ばれています。
  2. フィボナッチ数列 {1,1,2,3,5,8,13,21,34,55} では、フィボナッチ数列内の 2 つの隣接する数字の比率が黄金比の値 0.618 に限りなく近いことがわかりました。

フィボナッチ探索原理

フィボナッチ探索の原理は、二分探索や補間探索に似ています。中間点(mid)の位置を変えるだけです。midはもはや中間でも補間でもなく、黄金分割点の近くにあります。つまり、mid = low + F(k-1)-1、Fは以下に示すようにフィボナッチ数列を表します。

F(k-1)-1の理解:

  1. フィボナッチ数列 F[k] = F[k-1]+F[k-2] の性質により、**(F[k]-1) = (F[k-1]-1)+(F[k-2]-1)+1** が得られます。この式は、主系列テーブルの長さが F[k]-1 の場合、上図に示すように、テーブルを **F[k-1] と **F[k-2]** の長さの 2 つのセグメントに分割できることを示しています。したがって、中間の位置は、mid = low+F(k-1)-1 です。
  2. 同様に、各フィールドも同様の方法で分割できます。
  3. ただし、シーケンス リストの長さ n は必ずしも F[k]-1 と正確に等しいとは限らないため、シーケンス リストの元の長さ n を F[k]-1 に増やす必要があります。ここでの k の値は、F[k]-1 が n とちょうど同じかそれよりも大きくなる程度に十分です。次のコードでは、シーケンス テーブルの長さが増加した後、新しく追加された位置 (n+1 から F[k]-1 まで) にはすべて n の位置の値が割り当てられます。
  1. n>fib(k)-1 の場合{
  2. 関数
  3. }

コード例

  1. パッケージ com.xie.search;
  2.  
  3. パブリッククラス Fibonacci {
  4.  
  5. 公共 静的void main(String[] args) {
  6. int arr[] = {1, 8, 10, 89, 1000, 1234};
  7. 整数n = 6;
  8. 整数x = 1;
  9.  
  10. // int [] arr = 新しいint [100];
  11. // ( int i = 0; i < 100; i++)の場合{
  12. // arr[i] = i;
  13. // }
  14. // int n = 100;
  15. // int x = 1;
  16.  
  17. System.out.println ( "インデックスで見つかりました: " +
  18. fibMonaccianSearch(arr, x, n));
  19. }
  20.  
  21. /**
  22. * xとyの最小値を返す
  23. *
  24. * @パラメータ x
  25. * @param y
  26. * @戻る 
  27. */
  28. 公共 静的 整数 最小値( int x, int y) {
  29. 戻り値(x <= y) ? x : y;
  30. }
  31.  
  32. /**
  33. * フィボナッチはxのインデックスを検索し、見つかった場合はそのインデックス位置を返し、見つからない場合は-1を返します。
  34. * <p>
  35. * アルゴリズムの説明:
  36. * arr[0..n-1]を入力配列とし、検索する要素をxとします。
  37. * 1. n 以上の最小のフィボナッチ数を見つけます。この数をfibM [m番目のフィボナッチ数]とすると、
  38. * 前の 2 つのフィボナッチ数を fibMm1 [(m-1) 番目のフィボナッチ数] と fibMm2 [(m-2) 番目のフィボナッチ数] とします。
  39. * 2. 配列内にチェックする要素がある場合:
  40. * a. x を fibMm2 がカバーする範囲の最後の要素と比較します。x が一致する場合は、インデックスを返します。
  41. * b. x が要素より小さい場合は、3 つのフィボナッチ変数を 2 つのフィボナッチ分前方に移動します。つまり、残りの配列の最後の約 3 分の 2 が削除されます。
  42. * c. x が要素より大きい場合は、3 つのフィボナッチ変数を 1 つのフィボナッチ分後方にシフトします。オフセットをインデックスにリセットします。これらを合わせると、残りの配列の約 3 分の 1 が削除されることになります。
  43. * 3. 比較する要素がもう 1 つある可能性があるので、fibMm1 が 1 かどうかを確認します。そうであれば、x は残りの要素と比較されます。一致する場合は、インデックスが返されます。
  44. *
  45. * @param arr 配列
  46. * @param x 検索する値
  47. * @param n 配列の長さ
  48. * @return x インデックス位置または -1
  49. */
  50. 公共 静的  int fibMonaccianSearch( int arr[], int x, int n) {
  51. // フィボナッチ数を初期化する
  52. //(m-2)番目のフィボナッチ数
  53. fibMMm2 = 0;
  54. //(m-1)番目のフィボナッチ数
  55. fibMMm1 = 1;整数
  56. //m番目のフィボナッチ数
  57. fibM = fibMMm2 + fibMMm1;
  58.  
  59. /* fibM は n 以上の最小のフィボナッチ数を格納します*/
  60. (fibM < n)の間{
  61. fibMMm2 = fibMMm1;
  62. fibMMm1 = fibM;
  63. fibM = fibMMm2 + fibMMm1;
  64. }
  65.  
  66. // 前のマークから範囲を削除します
  67. 整数オフ​​セット = -1;
  68.  
  69. /* 要素をループします。arr[fibMm2] と x を比較することに注意してください。fibM が 1 になると、fibMm2 は 0 になります */
  70. (fibM > 1)の場合{
  71. // fibMm2 が有効な位置であるかどうかを確認します
  72. int i = min (オフセット + fibMMm2, n - 1);
  73.  
  74. /* x がインデックス fibMm2 の値より大きい場合、オフセットから i までのサブ配列に分割されます */
  75. もし(arr[i] < x){
  76. fibM = fibMMm1;
  77. fibMMm1 = fibMMm2;
  78. fibMMm2 = fibM - fibMMm1;
  79. オフセット = i;
  80. }そうでなければ(arr[i] > x) {
  81. /*インデックス fibMm2 の値より小さい場合、配列は i+1 から arr.length-1 までカットされます*/
  82. fibM = fibMMm2;
  83. fibMMm1 = fibMMm1 - fibMMm2;
  84. fibMMm2 = fibM - fibMMm1;
  85. }それ以外{
  86. /* 見つかった場合はインデックスを返す */
  87. iを返します
  88. }
  89. }
  90.  
  91. /* 最後の要素を x と比較します */
  92. (fibMMm1 == 1 && arr[オフセット + 1] == x)の場合{
  93. オフセット+1を返します
  94. }
  95.  
  96. /*結果が見つからない場合は -1 を返します */
  97. -1 を返します
  98. }
  99. }

【編集者のおすすめ】

  1. Kafka 2.8.0 がリリースされ、正式に ZooKeeper から分離しました。
  2. 知っておくべき 11 のマイクロ フロントエンド フレームワーク
  3. プログラマーにとって信頼できる副業は何ですか?
  4. Windows 10 ユーザーの 90% はこの機能について知りません。神のようなワイヤレススクリーン投影
  5. 21H2 が 5 月のアップデートとして確定しました! Windows 10の今年最初のメジャーアップデートが近づいています

<<:  AIシステムのセキュリティテストのための自動化ツール

>>:  機械学習により顕微鏡検査がこれまで以上に向上

ブログ    
ブログ    

推薦する

Googleは視覚障害者の走行を支援するAIシステムをテストしている

[[353439]]この記事はLeiphone.comから転載したものです。転載する場合は、Leip...

負荷分散アルゴリズムを理解していますか?

[[286998]]負荷分散アルゴリズムには、ポーリング、ランダム、最小接続の 3 つがあります。...

AIの将来にとって人間の関与が重要な理由

人工知能技術の進歩は、自動化と革新の新しい時代の到来を告げるものとなるでしょう。しかし、機械知能の進...

ファーウェイの孫茂陸氏:今後5年間で10億ドルを投資し、スマートエンタープライズサービスを構築する

上海で開催されたHUAWEI CONNECT 2019で、ファーウェイはエンタープライズサービス開発...

AIプロジェクトが失敗する6つの理由

人工知能が人間の生活と市場に与える影響は計り知れません。世界経済統計によると、人工知能は2030年ま...

15分 = 1年!人工知能と材料科学が出会うとき...

最近、NPJ—Computational Materials誌に研究論文が掲載されました。この論文は...

今日のアルゴリズム: 文字列の乗算

[[421393]]この記事はWeChatの公開アカウント「3分でフロントエンドを学ぶ」から転載した...

人工知能はデータを「食べる」

機械学習 (ML) プロジェクトに取り組んだことがある人なら、機械学習ではアルゴリズムをトレーニング...

世界のAIチップ投資環境が明らかに、5つのシナリオにチャンスあり

[[241691]]画像出典: Visual China AIチップ投資マップAI チップの設計は、...

...

NSA、RSA暗号化アルゴリズムに2つ目のバックドアを追加

ロイター通信は12月、米国国家安全保障局(NSA)が、携帯端末で広く使用されている暗号化技術にバック...

「紫禁城の戦い」 - ディープラーニング フレームワーク: Keras VS PyTorch

TensorFlow は、多くの科学者、エンジニア、開発者にとって主要なディープラーニング フレー...

人工知能の新時代が近づいています。従来の産業の従事者はどこへ向かうのでしょうか?

世間の好むと好まざるとにかかわらず、人工知能の新しい時代が静かに到来した。しかし、人工知能が本格的に...

空中でスクリーンに文字を書くのは魔法のようです。指をつまむだけで実現します。

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...