バイナリ検索&&半分の中央値

通常のバイナリ検索

1つの int型の BS(int型 L、int型の R&LT、INT X)
 2 { // それは-1を返す見つけることができない、間隔LとRのXを見つける
3。     int型、L = L、R = R<
 4      ながら(L <= R ){
 5          INT M = L + R&LT >> 1 ;
 6          IF [M](==のX){
 7。             リターンM;
 8          }
 。9           IF [M](A> X){
 10              R&LT M- = 1。;
 11          }
 12である         {
 13れます             L = M + 1 14          }
 15      }
 16      リターン - 1 17 }

Editionは、単純に詳細にまとめていません

中央値は、バイナリ検索

問題の意味:長さnの2つの順序付けられたシーケンスを考えると、合併後のビットの2つのシーケンスの合計

直接統治法、(2N + 1)回答/ 2数、複雑さはO(N)で停止し、出力する見つけます

しかし、問題は、我々は思考の変化を持って、LOGN必要です。

 

2の順序付けられたシーケンスに従うことを条件として、その2つの配列の中央値は、O(1)、その後、中央値と中央値の最終的な答えは、これら2つの配列が行うには何を持って、得られることができますか?第二は、B、中央値メガバイトで、最初のシーケンスはミリアンペアの中央値は、呼ばれていると、彼らの労働組合は、c、ANSに最終的な答えです。

 

MAは== MB場合、それは、ANSの両端部に、それぞれ、MAとMBの両端の両端で、ANSだけaはMA + MB >> 1であります

 

MA <MBた場合、それは中央値がbよりも小さくなるように、と言うことですので、左右のサイドbが考えられ、ANS MAとMBの途中でいくつかしていない可能性があり

 

MA> MBの場合、上記の状況、とみなすBは、Bは次のように見ることができます

 

だから、終了条件に達するまで、あなたは(知っているふりを)半分Cを削除することができますたびに、複雑さはO(LOGN)アップです!

1つの#include <iostreamの>
 2  使用して 名前空間STDを、
3  INT [ 100010 ]、B [ 100010 ]。
4  INT N。
5つの int型の BS(INT LA、INT RA、INT LB、INT RB){
 6      int型 MA =ラ+ RAを>> 1 7      INT MB = LB + RB >> 1 8      もし([MA] == B [MB]){
 9          リターン[MA]。
10      }
 11      であれば([MA] <B [MB]){
 12の         BS(LA、RA、LB、RB)。
13      }
 14      他の 場合([MA]> {[MB] B)
 15の         BS(LA、RA、LB、RB)。
16      }
 17  }
 18  のint main()の
 19  {
 20      CIN >> N。
21      のためにint型 I = 1 ; I ++; iが<= N 22          CIN >> [I]。
23      のためには、int型 i = 1 ; iが<= N; I ++ 24          CIN >> B [i]は、
25     COUT << BS(1、nは、1 、N)。
26 }
コードの表示

 

この時点で、我々はまだポイント境界条件と終了条件が不足して、コードを書くことができます。

だから、それは極端な例何で、もちろん、最終的な答えは、その小さなABシーケンス一度だけです

次に、試料を間違っがあるかどうか、もう一度実行して、デッドサイクルが見つかりました:

配列が35である場合シーケンスbが4である場合、MA = 3、MB = 4、 右ケースを境界と見なされるように、MAとMBのない穿刺削除を残していません。

プロモーションは、3つの要素のみの全配列は、国境ケースを考慮した場合、最終的な答えは間違いなく数の中でナンバー3、私のアプローチです:長さの異なる2つの配列の出現、ほとんど配列ポインタを左右することをしましょうその後、ライン上にシフトし、最初の終了条件に戻ります!

コード:

1つの#include <iostreamの>
 2  使用して 名前空間STDを、
3  INT [ 100010 ]、B [ 100010 ]。
4  INT N。
5つの int型の BS(INT LA、INT RA、INT LB、INT RB){
 6      int型 MA =ラ+ RAを>> 1 7      INT MB = LB + RB >> 1 8  
9      もし(LA == {RA)
 10          リターン [MA] <[MB] B?[MA]:[MB] B。
11      }
 12     もし(及び== [IN] B [MB]){
 13          リターンと[IN]。
14      }
 15      であれば(および[IN] < {[MB] B)
 16          日= オン。
17          のRb = MB。
18          もし(RA-ラ!= RB- LB)
 19          RA-ラ> RB-ポンド?ラ++:++ポンド20の         BS(LA、RA、LB、RB)。
21      }
 22      それ以外の 場合(および> [IN] {[MB] B)
 23          LB = MB。
24          のRA = 中;
25          もし(RA-ラ!= RB- ポンド)
 26         RA-ラ> RB-ポンド?ラ++:ポンド++ ;
27の         BS(LA、RA、LB、RB)。
28      }
 29  }
 30  のint main()の
 31  {
 32      CIN >> N。
33      のためにint型 I = 1 ; I ++; iが<= N 34          CIN >> [I]。
35      のためには、int型 i = 1 ; iが<= N; I ++ 36          CIN >> B [i]は、
37      COUT << BS(1、nは、1 、N)。
38      リターン 0;
39 }
コードの表示

 複雑さは複合体はO(LOGN)で検索するには、O(n)が入力され、全体的な複雑さはO(LOGN)(面白い手動)です。

 

 

    

 

おすすめ

転載: www.cnblogs.com/qq2210446939/p/11571934.html