二分法,尺取法,折半列舉,你們到底是什麼

2021-10-03 15:24:05 字數 1082 閱讀 3323

最近寫了一些題,對這三個概念稍微有點混淆,寫點東西回憶一下。

二分法簡介,將題目要求的量當做目標值,使用兩個引數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時,還沒有找到該數...