通常のバイナリ検索
1つの int型の BS(int型 L、int型の R&LT、INT X) 2 { // それは-1を返す見つけることができない、間隔LとRのXを見つける 3。 int型、L = L、R = R&LT; 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)(面白い手動)です。