本当に単純なバイナリ検索? - 第II章アルゴリズムShangjishijianレポート

練習のトピック

バイナリサーチアルゴリズムを書き換える (20 

元のタイトル:「コンピュータアルゴリズムの設計と解析」、王暁東

[0:N-1]が設定され、良好な配列を有し、書き換えアレイの行であるバイナリサーチアルゴリズムを xが配列されていないとき、xの最大の要素の位置を返すようにすることは、私未満、位置の最小のJ Xの要素よりも大きいです。配列の要素を探し、iとjと同じ、両方の配列の位置x。

入力フォーマット:

2行を入力します。

最初の行は、n及びxの値であり、2行目は、それぞれ整数との間のスペースで区切られたn個の異なる整数、非降順です。

出力フォーマット:

添字jは最小X最大出力要素iはxの最小の要素よりも大きい最大屈折率よりも小さいです。配列の要素を検索する場合、i、jは同じ。ヒント:Xは、出力がフル値未満の場合:-1 0、xはすべての値よりも大きい場合、出力:N-1の値は、n個

サンプル入力:

ここでは、入力のセットを与えられています。例えば:

6 5
2 4 6 8 10 12

出力例:

出力に対応し、ここで考えます。例えば:

1 2

 

問題の第二に、説明

既にアレイをソートすることが知られている二分探索アルゴリズムの改善の、バイナリサーチアルゴリズムを介してデータx入力は、最初のxは、左アレイ上(アレイ(右アレイ内の)指定されたよりも大きいか小さいかを決定改善します)内またはアレイのサイズに位置する、Xは配列の添字または出力インデックスindexとXの出力であり、xがある場合、配列は、xより小さい最大数の最小数よりも大きいです。

バイナリ検索は、それがxの場合の結果を得ることができるように、ちょうどその上に配列されていない、それを改善、配列内のx配列の添字を検索します。

 

第三に、アルゴリズム記述

1、IF(X <[0])COUT << " - 1 0 \ n";

    他の場合(X> [N-1])COUT << N-1 << " "<< N <<" の\ n"。

    他BinarySearch(X、N)

 

中央の場合、最大xは、アレイの最小配列、バイナリサーチアルゴリズムより大きいまたは小さいと判断する、改良されたコール

 

図2に示すように、二分探索(変性)

 

([]、int型のx、int型N INT)ボイドBinarySearch {

    ; 0 =左のint

    右int型= N-1;

    INTフラグ= 0。

    一方(左<=右){

        INT中間=(左+右)/ 2。

        もし(x == A [中央]){

            coutの<<真ん中<<」「<<ミドル<<てendl;

            返します。

        }

        IF(X> [中央]){

            左=中央+ 1。

        }

        他の{

            右=中間-1。

        }

    }

    <<左1 <<」「<< ENDL <<ままの場合([左]> X)COUT。

    他の場合(X> [左])COUT <<左<<」「<<左+ 1 << ENDL。

    返します。

}

 

右、左及び複数のアレイ素子、デジタルループ(中央値、ソート)を得るために得られた中間体配列の存在、数がXである場合に得られた中間体は、直接出力x未満である場合、右、すなわちデジタル左を取るために、アレイの両端小規模、または狭い範囲(半々収縮、Xが発呼二分法アルゴリズム中間数に対して左範囲のための中間体は、再帰右側に中間範囲に関数の呼び出し、およびその逆の数よりも大きい場合)。

それは、配列xでない場合は、配列に残っていると答えるために必要な図の右側Xは良い順の配列は既に、その後、予約していたからです。アルゴリズムの半分が停止したときに、単にXの数及び大きさの「左」電流を比較し、XおよびXよりも大きいが、配列インデックスの最大数未満である最小数を決定することができるであろう。xが左よりも大きい場合には、そのように左2と左、1 +左用の左1の数、およびその逆。

 

時間と空間解析アルゴリズムの複雑さ、第四

 

([]、int型のx、int型N INT)ボイドBinarySearch {

    ; 0 =左のint

    右int型= N-1;

    INTフラグ= 0。

    一方(左<=右){

        INT中間=(左+右)/ 2。

        もし(x == A [中央]){

            coutの<<真ん中<<」「<<ミドル<<てendl;

            返します。

        }

        IF(X> [中央]){

            左=中央+ 1。

        }

        他の{

            右=中間-1。

        }

    }

    <<左1 <<」「<< ENDL <<ままの場合([左]> X)COUT。

    他の場合(X> [左])COUT <<左<<」「<<左+ 1 << ENDL。

    返します。

}

 

バイナリ検索アルゴリズムの時間計算量解析:

データサイズがNであると仮定する(すなわち、左右各通話中)、プログラムの実行は、C(N)で表される比較の数は、存在しないプログラムデータを見つけるために想定される、回数は、この時点で行われる最も:

 

最初の時間が行われる:(xは、比較が行われ、[中間]、左右アルゴリズムの値が一度呼び出され表す場合、すなわち、半分未満のそれぞれの新しいデータのサイズの代わりに、(N / 2))

 

間隔のサイズはN、N / 2、N / 4、...、N / 2 ^ K(次に、要素の残りの数の動作)、kはサイクルである後に各2分間一旦、n個の要素の合計をとります番号。最終的にダウンし、各サブセクション1の大きさにK-倍半、そして後最悪の場合、あなたが望む要素を検索します。

その結果、N / 2 ^ k = 1

利用できる= log2n K、(ベース2に基づいて、N個の対数のために)、それは(時間複雑度Oを表すことができる)= O(LOGN)

 

バイナリサーチアルゴリズムスペースの複雑さの解析:

周期的配列の範囲を変更、元の配列では、手を反復アルゴリズムを使用して、他の補助スペースアプリケーションが存在しない、空間複雑さが一定であり、O(1)です。

 

第五に、感情や経験

バイナリコードの検索にヒットすることは難しいことではありません、それは非常にシンプルで非常に基本的なアルゴリズムであり、この質問は、上の改善することは困難です。ルールを見つけるために、Xは配列内にない場合、xがポイントの最大数及び最小数未満であると、左または右の最後の要素には、2つの点で、アレイは順序付けられたシーケンスであるので、それは、Xよりも大きいです。バイナリサーチのための枠組みを築くために始めて、その後、多くの場合に分け、これの思想と達成するためにいくつかの時間がかかりましたが、また、特に複雑なコードを演奏し始め、実際には、多くの場所は、長いったらしい操作を繰り返している、思い出した教師を削除いくつかの役に立たないコード、特に改善された爽快。

だから、コードはハードの問題に対する解決策を考えて、再生することは難しいことではありません。一度岸に、同様に、あなたも動揺ソリューションを参照してくださいどのような変更および使用、やっているすべてのステップのすべての行を解析し、Duokanjibianコードをする独自のコードを演奏することは、良くないのためにそうコードを抜け出すために初めて改善と簡素化。

おすすめ

転載: www.cnblogs.com/990924991101ywg/p/11563859.html