最近寫了一些題,對這三個概念稍微有點混淆,寫點東西回憶一下。
二分法簡介,將題目要求的量當做目標值,使用兩個引數l,r
l,rl,
r,ll
l從初始位置(往往是最小值之類的),r
rr從最終位置(往往是最大值),每次判斷二者的平均值mid
=(l+
r)>
>
2mid=(l+r)>>2
mid=(l
+r)>
>
2是不是滿足題意,根據該判斷更新l
ll或者r
rr的值。二分法的應用大概包括以下幾部分:
專欄有不少對應的題
尺取法簡介,尺取法是對陣列儲存一對下標,即所選取的區間的左右端點,然後根據實際情況不斷地推進區間左右端點以得出答案。這對下標記為l,r
l,rl,
r,與二分法不同的是,這裡的l,r
l,rl,
r都是從區間的一側開始的,而不是從區間兩側,而且尺取法擅長處理區間相關的問題,比如
同樣專欄有不少題
有時候,問題的規模較大,無法列舉所有元素的組合,但能夠列舉一半元素的組合。此時,將問題拆成兩半後分別列舉,再合併它們的結果這一方法往往非常有效。不同於前兩種方法,折半列舉並不需要維護兩個端點,它的精髓在於如何拆分,使得我們不用列舉所有的元素。
目前見到過最經典的應用無非是
我們無法列舉所有的a+b
+c+d
a+b+c+d
a+b+c+
d的值,但是我們可以將a+b
+c+d
=0a+b+c+d=0
a+b+c+
d=0拆分成a+b
=c+d
a+b=c+d
a+b=c+
d,然後分別列舉a+b
,c+d
a+b,c+d
a+b,c+
d兩個部分進行判斷。
折半列舉部分例題我放在二分法的專欄了。有興趣可以solve
折半查詢法 二分法
在有序 設為公升序 表中,取中間元素作為比較物件,若給定值與中間元素的關鍵字相等,則查詢成功 若給定值小於中間元素的關鍵字,則在中間元素的左半區繼續查詢 若給定值大於中間元素的關鍵字,則在中間元素的右半區繼續查詢。不斷重複上述查詢過程,直到查詢成功,或所查詢的區域無該資料元素,查詢失敗。測試資料 1...
查詢之折半二分法
折半二分法是針對已經排好序的資料,效率比順序查詢快很多。比如2的8次方個資料最多隻需要查詢8次就能找到了,但是前提是此資料已經排好序了!include using namespace std const int n 10 template void bsearch t data,t find,int...
二分法查詢(折半查詢)
一 二分法查詢思想 首先從陣列的中間mid開始查詢,如果剛好等於要查詢的值,則返回這個數字的所在位置。如果要查詢的數字比mid值小,則讓mid 1,做為陣列的右邊界,重複 1 操做 如果要查詢的數字比mid大,則讓mid 1做為陣列的左邊界,重複 1 操作。如果left right時,還沒有找到該數...