フィボナッチ検索アルゴリズム(黄金分割探索アルゴリズム)

フィボナッチ検索とは何ですか

      また、金色の列、このような一連を指すものとして知られているフィボナッチ数:1,1,2,3,5,8,13,21、????、数学では、フィボナッチは再帰的です以下のように定義される:F(1)= 1、F(2)= 1、F(n)はFを=(N-1)+ F(N-2)(N> = 2)。2つの数の次の隣接比の列の数は、黄金比(0.618)の値は可能性が高いです。

     フィボナッチはバイナリサーチに基づいて記載されているフィボナッチに応じて分割されて下さい。テーブル内の要素の数を見つけるためにルックアップよりもわずかに大きいに等しい列の証書のフィボナッチ数はF [n]は、要素に追加した場合、拡張長さF [N](追加最後の要素になるまで繰り返され、元のルックアップテーブルの数フィボナッチ分割の完了後に行わ満たすF [n]の要素は)、すなわち、F [n]は、要素F [N-1]の要素、F [N-2]の要素の後半の前半部分に分割されていますあなたが見つけるまで、その部分での再帰的を探すための要素を識別します。

フィボナッチ探索時間複雑性はO(2 Nログ)であるが、二分探索に比べ、フィボナッチ利点を見つけるためには、それだけ分割することなく加算と減算を含むことである、とに加減算の分周比場合によっては、それには時間がかかり、そのため、理論的には、フィボナッチは契約を見つけるためのバイナリサーチの時間よりも小さい場合に実行されますが、まだ持っています。

フィボナッチ数について:1,1,2,3,5,8,13,21,34,55,89 ......列の数が増加する前と後の、2つの数の比で、(0から開始してもよいです) 0.618の黄金比に近づきます。89例ここで、前二フィボナッチと34と55によって添加後89で順序付きリスト、要素89の、すなわち数として、それの全体の要素数前半34へと組成の最初の55個のデータ要素のデータ要素による順序付きリストの半分、そして、前半の要素数の比と0.618に黄金比に近い長さの全体の順序付きリスト、あなたが検索したい場合は、最初の半周期の要素は、次に、検索を続行し、前半の後半に進み、フロント前半の21個の要素は、34個のデータ要素に分割され、ビューのフィボナッチ数を追跡するために55 + 21 = 34を継続しますそうもう一度、あなたが成功したか失敗したかを見つけるため、検索アルゴリズムにフィボナッチ数を置くまでに適用されます。

図からわかるように、要素の数はフィボナッチ、リストをソートされていないときNumber列の数は、満たされた必要な長さの順序リスト内の要素の数は、それがでフィボナッチ数とします価値が、もちろん、我々は、元のテーブルの切り捨ては確かに可能ですが、またそれ以外の検索方法を命じました。(F [K])、その後、動作があろう-1図フィボナッチの数値列の値をとるそれぞれを識別する、ランクが純粋ビットを満たすために、0から始まるリストアレイを注文したのでゼロからの注文。フィボナッチは、反復フィボナッチ検索アルゴリズムによって達成される次のとおりです。

する#include <stdio.hに>  
  
の#define FIB_MAXSIZE 100  
  
/ ** 
 *フィボナッチ数発生 
 * @paramのFIB:数のストレージフィボナッチ配列へのポインタ 
 * @paramサイズ:フィボナッチ数の長さ 
 * /  
ボイドProduceFib(INT * FIB、int型のサイズ)  
{  
    int型I;  
  
    FIB [0] = 1;  
    FIB = 1; [1]。  
  
    ための(I = 2; Iは、サイズ<; Iは++)  
    {  
        FIB [I] = FIB [I - 1] + FIB [I - 2];  
    }  
}  
  
/ ** 
 *フィボナッチ探索は、探索が成功した戻りビット列、そうでなければ-1 
 * @paramデータ:表規則配列 
 * @param長さ:順序テーブル要素数 
 * @paramのsearchValue:検索キーにする 
 * /  
INT FibonacciSearch(データのint *、int型の長さ、INT searchValue)  
{  
    ローINT、高、中、K、I、FIB [FIB_MAXSIZE];  
  
    低い= 0;  
    ハイ=長さ- 1;  
  
    ProduceFib(FIB、FIB_MAXSIZE);  
  
    K = 0;  
    //はフィボナッチの要素数の順序付けられたリストを見つけます。列の最大数に最も近い数の値が  
    しばらく(ハイ> FIB [K] - 1)  
    {  
        ; K ++  
    }  
  
    リスト順序付け充填//  
    のための(I =長さ、Iは<= FIB [K] - 1; Iは++)  
    {  
        データ[I] =データ[高];  
    }  
  
    一方(低<=高)  
    {  
        MID =低FIB + [K - 1] - 1; //カラムであった黄金証書のフィボナッチ数  
  
        であれば(データ[中間] = searchValue =)  
        {  
            IF(MID <=長さ- 1)  
            {  
                MIDリターン;  
            }  
            他  
            {  
                //補値取得され記述されたデータ要素を見つける  
                戻り長さを- 1;  
            }  
        }  
  
        (DATA [MID]> searchValue)IF  
        {  
            高MID = - 1;。  
            。K = K - 1;  
        }  
  
        IF(データ[MID] <searchValue)  
        {  
            低= MID + 1;  
            K = K - 2;  
        }  
    }  
  
    戻り-1;  
}  
  
int型のmain()  
{  
    int型データは、[] = {1,3,5,7,9,11、 13,15,17,19,21}。  
  
    INTインデックス= FibonacciSearch(データ、11、19)。  
    printf( "%d個の\ n"、インデックス)  
  
    0を返します。  
}

フィボナッチ利点を見つける見つけるフィボナッチリース時間や複雑性O(log2n)が、バイナリ検索と比較して、それだけ以上を占めるように分割、減算及び除算することなく加算と減算を含むことです多くの時間は、したがって、理論的には、フィボナッチランタイム証書は、バイナリ検索よりも小さく見えますが、場合によっては、まだ、に持って、

転載ブログ:https://www.cnblogs.com/lpfuture/p/7112450.html

おすすめ

転載: blog.csdn.net/yimixgg/article/details/90903166