1. 程式人生 > 資訊 >中國電科“探地雷達綜合檢測車”趕赴洪澇災區做“CT”

中國電科“探地雷達綜合檢測車”趕赴洪澇災區做“CT”

二分的本質是丟棄,即整體可以劃分為兩部分,一部分滿足這種性質,另一部分不滿足這種性質,捨棄掉不滿足這種性質的一半,從另一半開始尋找,邊界在這個過程進行了改變。

二分的關鍵是邊界點的二分,二分可以找到滿足這個性質的邊界點或不滿足這個性質的邊界點。

整數二分(需要取整,考慮邊界問題)

求邊界點A或邊界點B分別有兩個板子。

(1)二分出來邊界點A
先設一中間值,mid =( l+r+1)/2;
每次判斷一下,這個中間值是否滿足紅顏色自己的性質 if(check(mid));
結果為真的話,說明A應該在中間值的右側,即[mid,r],然後更新:l = mid;
結果為假的話,說明A應該在中間值的左側,即[l,mid-1],然後更新:r = mid-1;

(2)二分出來邊界點B
先設一下中間值,mid = (l+r)/2;
每次判斷一下,這個中間值是否滿足綠顏色自己的性質 if(check(mid));
結果為真的話,說明B應該在中間值的左側,即[l,mid],然後更新:r= mid;
結果為假的話,說明B應該在中間值的右側,即[mid+1,r],然後更新:l= mid+1;

注意

如何考慮用哪個板子,拿題先寫check函式,然後想一下怎麼更新區間。如果更新區間是l = mid,r = mid-1;則,中間值補上+1。

那麼,為什麼求A的時候需要加1,這就是會死迴圈中的一個。
c++裡面是下取整,如果 l = r-1,mid又沒有加1,那麼mid = (l+r)/2 = l;
檢驗,當結果為真,更新,l = mid = l, l還是原來的l,[l,r]還是[l,r],死迴圈。

模板

while(l<r)

{

int mid=(l+r)/2;

if(q[mid]>=x) r=mid;

else l=mid+1;

}

while(l<r)

{

int mid=(l+r+1)/2;

if(q[mid]<=x) l=mid;

else r=mid-1;

}

浮點二分(不考慮邊界)

if() l=mid;

else r=mid;