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システムのセキュリティテストのための自動化ツール

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

ブログ    

推薦する

ヘルスケア業界における人工知能と機械学習の応用

[[414016]]ヘルスケア業界における人工知能と機械学習の役割を理解するには、ヘルスケア業界にお...

人工知能産業は活況を呈しているが、スタートアップ企業は資金調達が難しくなっている

12月13日、人工知能(AI)スタートアップ企業へのベンチャーキャピタルの収益が鈍化している可能性が...

2018 年に人工知能があなたの生活、仕事、遊びに革命を起こす 8 つの方法

2017年、人工知能はあらゆる面でブームを巻き起こしました。イーロン・マスクからマーク・ザッカーバー...

1つのモデルで8つの視覚タスクを処理し、1つの文で画像と動画を生成できます。

[[437247]]この記事はAI新メディアQuantum Bit(公開アカウントID:QbitA...

新しいプログラミングパラダイム: Spring Boot と OpenAI の出会い

2023年にはAI技術が話題となり、プログラミングを中心に多くの分野に影響を及ぼします。 Sprin...

LoRAShear: LLM プルーニングと知識回復に関する Microsoft の最新研究

LoRAShear は、言語モデリング (LLM) を最適化し、知識を保存するために Microso...

人工知能とビッグデータの時代において、一般の人々はどうやってお金を稼ぐのでしょうか?

将来、旅行には自動運転車、食事にはプログラムされたスナックストリート、ヘアカットにはロボット理髪師、...

...

7つの機械学習アルゴリズムの7つの重要なポイント

さまざまなライブラリとフレームワークの助けを借りて、たった 1 行のコードで機械学習アルゴリズムを実...

...

人工知能は前例のないキャリア革命をもたらすだろう

最近、サンフランシスコでEatsaというアメリカンレストランが人気になっています! [[203610...

人類の未来における人工知能の重要性

人工知能(AI)は私たちが住む世界を急速に変えています。医療から金融まで、人工知能は産業を変革し、私...

...

...

推奨に値する 7 つの優れたオープンソース AI ライブラリ

[[406029]] [51CTO.com クイック翻訳]人工知能 (AI) 研究の分野では、Ten...