補間+フィボナッチを探します

補間を探します

補間は、実際にバイナリサーチのアップグレード版で検索、我々はバイナリサーチを書くときに我々がないと思ったかわかりません

なぜそれはあなたがしたいすべての時間が半分に折っているのですか?1/4には、それをしませんか?1/8には、それをしませんか?私たちが考えることができるように、それは利用できません

それに対処するために、より正確な「バイナリ」方法を見つけること。

 

バイナリサーチ半ば=(ハイ+ロー)/ 2;変換に見える:ミッド=低+ 1/2 *(高 - 低)。

私たちは、「(高 - 低)」1/2の係数を見ることができますが、我々は見つけるために適応係数を探しています

中・下付きがより近いの数に対応するための目標数は、我々は、この因子のうち、変更する必要がありますように、独自の手続き

目標数に近い数を検索します。

 

だから我々は半ば=低+((キーと[低])/([高] -A [低]))*(高 - 低)に最適化されたプログラムされます。

だから我々は、この適応係数を見つけ、これはより速くそれらを見つけるでしょう。

補間検索の使用:成功または失敗時の複雑さを探すには、O(LOG2(log2n))です。

 

C ++のコードでは、達成するために:

#include <iostreamの>
 使用して 名前空間STD;
 INT InsertionSearch(INT A []、INT、高INT、キーINT低)// 高い最大電流配列の添字、現在の被写体アレイの低い最小値は、
{
     int型 MID =低+ ((Aは、キー[低])/([高] -A [低]))*(ハイ・ロー)、
     IF(キー== A [低])を
       返すMID;
     IF(キー> A [MID] )
       を返す InsertionSearchは(A、高、キー、MID + 1 ;) 
     IF(キー< [MID])
       を返すミッドInsertionSearch(Aを、1。、低キー、);    
} 

 

補間検索高速化も必要なシーケンスが発注されると、バイナリサーチの原則で、半分よりも、

プログラムが実行されている場合、シーケンス順序を変更するために、必要に応じてシーケンスが何回もあれば欠点は、その後、同じであるが、

補間は適用されません検索。

 

フィボナッチ検索

フィボナッチはまた、バイナリサーチの改良版を見つけ、フィボナッチは、最も重要なのは中間点を見つけることです見つけます。

検索アルゴリズムのこのタイプでは、我々は、アレイ内の黄金のセクションのこの中間点で探している、それは黄金のポイントが必要です

私たちは、フィボナッチ数を使用します。私たちは、このシリーズを見ることができます:1,1,2,3,5,8,13,21,34,55 ..........

それは、法律の両方を見ることができます。

1:第三項からスタートは、その前面及び両者のそれぞれに等しいです。

2:次の列の数、割合、すなわち黄金比の比は、正面に近い側とリア2 0.618です。

これら二つの法律で、私たちは、黄金のポイントに来ることができます。私たちは、この配列は、インデックスkで、F []であることを確認してください。

フィボナッチ・コアは、中間長さFの前方を見ている[K-1] -1、F [K-2] -1の背面の中央長さ;

具体的な手順:(検索対象の配列をAとします)

1:フィボナッチ配列を作成します。

2:N位置フィボナッチ配列、及び完全相補配列(使用可能A(N-1)充填する)(配列Aの長さ)を見つけます。

3:計算ミッド=低+ F(K-1)-1。

4:[中間]>キー(キー番号が検索される)場合、高=ミッド1; K = K-1;(中間長さの前に)

5:もし[中間[<キー低=ミッド+ 1、K = K-2(MID長以降)。

6:中間&& A [中間] =キー<=次いで、高屈折率の値(即ち、中間値)が返される場合、そうでない場合、ルックアップ障害;

 

#include<iostream>
using namespace std;
int max_size=20;
void fbnq_list(int *A)//构建斐波那契数组; 
{
    A[0]=A[1]=1;
    for(int i=2;i<20;i++)
    {
        A[i]=A[i-1]+A[i-2];
    }
}
int fbnq_search(int A[],int n,int key)
{
    int F[max_size];
    fbnq_list(F);
    int low=0;
    int high=n-1;
    int mid=0;
    int k=0;
    while(n>F[k]-1)//找出n在斐波那契数列中的位置 
        k++;
    for(int i=n;i<F[k]-1;i++)//将数组补全,大于n的下标对于的数全部为A【high】; 
        A[i]=A[high];
    while(low<=high)
    {
        mid=low+F[k-1]-1;//mid的位置为黄金分割点; 
        if(A[mid]>key)
        {
            high=mid-1;
            k=k-1;//F[k-1]-1为mid前面的元素个数; 
        }
        else if(A[mid]<key)
        {
            low=mid+1;
            k=k-2;//F[k-1] -1为mid后面的元素个数; 
        }
     else
        {
            if(mid <= high)//如果为真则找到相应的位置
                return mid;
            else
                return -1;
        }
    }
    return -1;
    
}
int main()
{
    int A[]={-1,2,3,45,54,78,95,102,158,458,1651,1656400};
    int key;
    cin>>key; 
    int x=fbnq_search(A,12,key);
    if(x!=-1) cout<<x;//输出所对应的下标; 
    else cout<<"没有该元素"; 
    return 0;
}

 

斐波那契查找是折半查找的升级版,那么也要求序列是有序的序列;

在最坏情况下,斐波那契查找的时间复杂度还是O(log2n),且其期望复杂度也为O(log2n),

但是与折半查找相比,斐波那契查找的优点是它只涉及加法和减法运算,而不用除法,

而除法比加减法要占用更多的时间,因此,斐波那契查找的运行时间理论上比折半查找小,

但是还是得视具体情况而定。

 

おすすめ

転載: www.cnblogs.com/zhoubo123/p/11258795.html