Binary Search์ ๊ตฌํ์ ๊ดํ ์ ๋ฆฌ. ์ฃผ์ ์์ฒด๋ solved.ac
๊ธฐ์ค ์ค๋ฒ ํฐ์ด ์ ๋์ผ ์๋ ์๊ฒ ์ง๋ง, ์ ๋๋ก ์ฐ๊ธฐ๊น์ง ์๋นํ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์ฃผ์ ์ด๊ธฐ๋ ํ๋ค. ๋, ๊ฐ์ข
์๊ณ ๋ฆฌ์ฆ์์ ๋ฌ๊ธ์์ด ํ์ด๋์ค๋ 1์์. O(n)
์ O(log n)
์ผ๋ก ์ค์ฌ์ฃผ๋ ๊ฐ๋ ฅํ ๋ฌด๊ธฐ.
bool find(int v) {int l = 0; int r = N - 1;while (l <= r) {int m = (l + r) / 2; // overflow prevent: l + (r - l) / 2;if (arr[m] == v) return true;if (arr[m] < v) {l = m + 1;} else {r = m - 1;}}return false;}
int lb(int v) {int l = 0; int r = N - 1;int ans = -1;while (l <= r) {int m = (l + r) / 2; // overflow prevent: l + (r - l) / 2;if (arr[m] >= v) {r = m - 1;ans = m;} else {l = m + 1;}}return ans;}
int lb(int v) {int l = 0; int r = N - 1;int ans = -1;while (l <= r) {int m = (l + r) / 2; // overflow prevent: l + (r - l) / 2;if (arr[m] > v) {r = m - 1;ans = m;} else {l = m + 1;}}return ans;}
Binary Search๋ ํญ์ ๊ตฌํ์ด ํท๊ฐ๋ฆฐ๋ค. ๋ฒ์๋ฅผ ์ด๋๊น์ง ํด์ผํ๋์ง, l
, r
์ค์ ์ ์ด๋ป๊ฒ ํด์ผํ๋์ง ๋ฑ๋ฑ...
์ฌ๊ธฐ์ ๊ทธ๋ฐ ๋ถ๋ถ๋ค์ ํ๋ฒ ์ ๋ฆฌํ๊ณ ๋์ด๊ฐ๊ณ ์ ํ๋ค.
์ฐ์ ํ์ค์ด ๋๋ STL
์ ์ฌ์ฉํ Binary Search ์ฌ์ฉ๋ฒ์ ํ์ธํด๋ณด์. ์ฌ์ฉํ ๋ vector
๋ ์ ๋ ฌ์ด ๋์ด ์์ด์ผ ํ๋ค.
binary_search
๋ ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ด ์๋์ง ์๋์ง ์ฌ๋ถ๋ฅผ ๋ฐํํ๋ค.
bool isExist = binary_search(v.begin(), v.end(), tval);
lower_bound
๋ ์ฐพ๊ณ ์ ํ๋ ๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์
๊ฐ์ด ์ฒ์์ผ๋ก ๋์ค๋ ์์ ์ ๋ฐํํ๋ค. ๋ฐํ๊ฐ ํํ๋ iterator
์ด๋ค.
auto it = lower_bound(v.begin(), v.end(), tval);
upper_bound
๋ ๊ฑฐ์ ๋์ผํ์ง๋ง ํฌ๊ฑฐ๋ ๊ฐ์
์ด ์๋ ํฐ
์ด๋ค. ์ฌ์ฉ๋ฒ์ ์์ ํ ๋์ผํ๋ค. (๊ฒฐ๊ณผ๋ง ๋ฌ๋ผ์ง๋ค)
auto it = upper_bound(v.begin(), v.end(), tval);
Binary Search
์ ์์๋ ์์๋ฅผ ์ฐพ์ ๋ ์ ์ฒด ์์(O(n)
)๋ฅผ ์ฐพ์ง ์์๋ ๋จ์ ๊ทธ ์์๊ฐ ์๋ค. ์ ๋ฐ์ฉ ์ฐพ์ ์์๊ฐ ์ค์ด๋๋ฏ๋ก Master Theorem
์ ์ํด ์๊ฐ๋ณต์ก๋๊ฐ O(log n)
์ผ๋ก ์ค์ด๋ค๊ฒ ๋๋ค.
์ง์ ๊ตฌํ์์ ์ ๊ฒฝ์จ์ผ ํ ํฌ์ธํธ๋ค์ด ๋ง์ด ์๋ค.
์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ arr[]
์์, ์์๋ฅผ ์ฐพ์ผ๋ฉด ์์ index, ๋ชป์ฐพ์ผ๋ฉด -1์ ๋ฆฌํดํ๋ ์์๋ฅผ ๋ณด์.
// [s, e] ๊ตฌ๊ฐ ์ฌ์ฉint binarySearch(int arr[], int s, int e, int tval) {int l = s, int r = e, mid;while (l <= r) {mid = (l + r) >> 1;if (tval == arr[mid]) return mid;else if (tval < arr[mid]) {r = mid - 1;} else {l = mid + 1;}}return -1;}
ํ๋ก ํ๋ ์์๋ฅผ ์ดํด๋ณด์.
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
value | 5 | 8 | 10 | 14 | 17 | 20 | 22 | 25 |
์ด ๊ฒฝ์ฐ, 10
์ ์ฐพ๋๋ค๊ณ ๊ฐ์ ํด๋ณด์.
arr[3] = 14 > 10
์ด๋ฏ๋ก, r
์ด 2
๋ก ์กฐ์ ๋๋ค.arr[1] = 8 > 10
์ด๋ฏ๋ก, l
์ด 2
๋ก ์กฐ์ ๋๋ค.l
== r
== 2
์ด๋ฏ๋ก, ๊ฐ์ ์ฐพ๊ณ ์ข
๋ฃ๋๋ค.์ฆ, ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋ ๋ฐฐ์ด ๊ธฐ์ค์ผ๋ก, ์ค์์ ๋ดค์ ๋ ๊ทธ ๊ฐ์ด ์ฐพ๋ ๊ฐ๋ณด๋ค ๋ ํฌ๋ฉด ํ๊ฒ๊ฐ์ ์ข์ธก์ ์์ ๊ฒ์ด๋ผ ์๊ฐํ ์ ์์ผ๋ฏ๋ก r
์ด ์กฐ์ ๋๋ ๊ฒ์ด๋ฉฐ, ๋ฐ๋์ ๊ฒฝ์ฐ l
์ด ์กฐ์ ๋๋ค๊ณ ํ ์ ์๋ค.
์ด ๊ฒฝ์ฐ ๋ ๋ถ๊ธฐ๋ฅผ ์ค์ด๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง, ๊ตฌํ์ด ์ฌ์ด ๋ฐฉ๋ฒ์ผ๋ก ์๋์ฒ๋ผ binarySearch
ํจ์๋ฅผ ๋ณ๊ฒฝํด๋ณผ ์ ์๋ค.
// [s, e) ๊ตฌ๊ฐ ์ฌ์ฉint lowerBound(int arr[], int s, int e, int tval) {int l = s, int r = e, mid, ans = e; // ans์ ์ด๊ธฐ๊ฐ์ ์ ์while (l <= r) {mid = (l + r) >> 1;if (tval == arr[mid]) {ans = mid;r = mid - 1; // ๋ง์ฝ ์์๊ฐ 1 2 3 3 3 3 3 4 5 ์ฒ๋ผ ๋์ด ์๋ค๋ฉด, ์ฒ์ ์ฐพ์ 3๋ณด๋ค ๋ ์ผ์ชฝ์ 3์ด ๋ ์์ ์ ์๋ค. ๊ทธ๋์ ๊ตฌ๊ฐ์ ์ผ์ชฝ์ผ๋ก ํด์ ๊ณ์ ํ์ํ๋ค.}else if (tval < arr[mid]) {ans = mid; // ์ฌ๊ธฐ์๋ ์์ด์ผ ํ๋ค.r = mid - 1;} else {l = mid + 1;}}return ans;}
lower_bound
์ ๊ฒฝ์ฐ ์์ฒ๋ผ๋ง ์์ ํ๋ฉด ๋๋ค. ๊ฐ์๋ return
ํ๋ ๊ฒ์ด ์๋๋ผ ๋ ์ฐพ๋ ๊ฒ์ด ํฌ์ธํธ.
upper_bound
๋ ์๋์ฒ๋ผ ํด๋ณผ ์ ์๋ค.
// [s, e) ๊ตฌ๊ฐ ์ฌ์ฉint upperBound(int arr[], int s, int e, int tval) {int l = s, int r = e, mid, ans = e; // ans์ ์ด๊ธฐ๊ฐ์ ์ ์while (l <= r) {mid = (l + r) >> 1;if (tval == arr[mid]) { // lowerBound ๊ตฌํ ๋๋น ๋ฌ๋ผ์ง๋ ๋ถ๋ถl = mid + 1; // ๋ ํฐ๊ฑธ ์ฐพ๋ ๊ฑฐ๋๊น ์ข์ธก์ด ์๋ ์ฐ์ธก์ผ๋ก ๊ณ์ํด์ ๋ณด๋ฉด ๋๋ค. (lowerBound๋ ๊ฒฝ๊ณ๊ฐ์์ ์ข์ธก, upper๋ ์ฐ์ธก)}else if (tval < arr[mid]) {ans = mid;r = mid - 1;} else {l = mid + 1;}}return ans;}
ans
๋ฅผ ์
๋ฐ์ดํธ ํ๋ ๋ถ๋ถ๋ง ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ ์ฝ๊ฒ ํ์ธํด๋ณผ ์ ์๋ค. tval == arr[mid]
๋ถ๋ถ์ ๊ตฌํ๋ง ๋ฌ๋ผ์ง๊ณ , ์ง๊ด์ ์ผ๋ก ์ดํดํ ์ ์๋ค. lower_bound
๋ ๊ฒฝ๊ณ๊ฐ์ ์
๋ฐ์ดํธ ํ์ง๋ง, upper_bound
๋ ์๋๋ค.