第二章では、手を要約したもの

1.タイトル:

二つの既知の非等長降順シーケンスS1、S2、S1およびS2機能評価の設計と設定中央値があります。順序付けられたシーケンス

A0、A1、...、AN-1 Aの中央値には、(N-1)/ 2、すなわち、第一⌊(N + 1)/2⌋数(0は数1である)を意味

 

入力フォーマット:

3行を入力します。最初の行は、N非整数の降順で、すなわち、行当たりの情報のシーケンスが続く共通の長さN(0 <N≤100000)のシーケンスを与えます。スペースでデジタル間隔。

 

出力フォーマット:

入力シーケンス内の2本の中間線とシーケンスの出力は、設定します

 

問題の説明:

トピックの意図は、2つの配列が順序付けられたシーケンスではあるが、2つの配列の同じ交差点の中央値は長配列を求めているが、どのように中央値は、二つの配列をマージ見つけることは困難であり、データセットがあってもよいです重複した数字があります!

 

3.アイデア:

最初の例:

 

サンプル入力:

5

1 3 5 7 9

2 3 4 5 6

インデックス:01234

sequnce1:1 3 5 7 9

配列2:2 3 4 5 6

2つの配列の中央値を見てみましょう:5と4、比較、見つかった:2シーケンス1つの大型の中央値比系列、ヘクタールああ?そして、これら2つの配列は注文しました

 

これは、2桁の数字の後に配列より前のシーケンス数の中央値は、それが小さいことを示すことではありません?(下)

XXX 2 XX 3 XXXXX 7 XX 9ので、そのようなものの相対的な順序を確立します

だから、私たちのために、再び前の操作の同じ配列の中央値よりも2のシリアルナンバー1の桁の後、我々は狭めし続けることができます。

まで!4配列のみダウンするとき、我々は中央値をしたいという番号(すなわち、左のシーケンス番号2、シーケンス番号2にも2に残っている)、そして、私たちはマージソート、中央値はこの時間、

 

、2つの配列の現在の中央値を比較する再帰左サブアレイの中央大きなアレイ、小右再帰メジアンサブアレイ、:問題解決プロセスがです

 

4.コード:

書式#include <iostreamの>

 

名前空間stdを使用。

 

 

middlevalueをINT(INT * L、INT * R、INT L_lindex、INT L_rindex、INT R_lindex、INT R_rindex)

{

       INT L_mid =(L_lindex + L_rindex)/ 2。

       INT R_mid =(R_lindex + R_rindex + 1)/ 2。

       IF(L_rindex-L_lindex == 1 && R_rindex - R_lindex == 1)

       {

              int型のカウント= 0;

              int型P1 = L_lindex、P2 = R_lindex。

              しばらく(カウント!= 2)

              {

                     (L [P1] <R [P2])場合

                {

                      ++数えます。

                      戻りL [P1](== 2カウント)場合。

                      P1 ++;

                }

                他の場合(L [P1]> = R [P2])

                {

                    ++数えます。

                    (== 2カウント)場合はR [P2]を返します。

                    P2 ++;

                }

              }

      

       }

       もし(R [R_mid]> L [L_mid])

       {

              middlevalue(L、R、L_mid、L_rindex、R_lindex、R_mid)。

       }

       他の場合(R [R_mid <= L [L_mid])

       {

              middlevalue(L、R、L_lindex、L_mid、R_mid、R_rindex)。

       }

      

}

 

 

メインint型()

{

       50 INT [100005] = {0}。

       INT R [100005] = {0}。

       int型のn;

       cinを>> N;

       以下のために(INT i = 0; iがn <; iは++)

       {

              CIN >> L [i]は、

       }

       以下のために(INT i = 0; iがn <; iは++)

       {

              CIN >> R [I];

       }

       IF(N == 1)

       {

              COUT <<(L [0] <R [0]、L [0]:R [0])。

       }

       他

       COUT << middlevalue(L、R、0、N-1、0、N-1)。

}

アルゴリズム分析の5実践の複雑さ:

1.二つのアレイが、各再帰回だけ、時間複雑度はlog2nであります

2.中央値を2回、各計算:2 * log2n

再帰log2nか否かを決定するために3

4.最後にリクエスト中央値をマージ:つつ - 、2内部処理 - もし、2:+ 2 3×2

5.したがって、前回の複雑性O(log2n)

6.まとめ:

自己疑い:私は証明する方法がわからない:最後のマージ中央値を収縮後の比較範囲は、全配列、非完全性の中央値です。

INT R_mid =(R_lindex + R_rindex + 1)/ 2;及びL_mid =(L_lindex + L_rindex)/ 2をint型、なぜ計算さR_midいつ分割された2つの配列の配列は偶数分割するために、これに1を加えサイズが一致していることができます

実際、多くの分割統治形態、代わり補間のバイナリ比較を使用して収穫、または非常に驚きであります

 

おすすめ

転載: www.cnblogs.com/aresjohnson/p/11565031.html