Binary Search๋ ์ ๋ ฌ๋์ด ์๋ ๋ฆฌ์คํธ์์ ํ์ ๋ฒ์๋ฅผ ์ขํ๊ฐ๋ฉฐ ์ํ๋ ๊ฐ์ ์ป๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๋ฆฌ์คํธ๊ฐ ๋ฐ๋์ ์ ๋ ฌ๋์ด ์์ด์ผ ํ๋ฉฐ, 3๊ฐ์ ๋ณ์ (low, mid, high)๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ํ์ํ๋ค.
์ค์๊ฐ(mid)์ ๊ธฐ์ค์ผ๋ก ๋น๊ตํ์ฌ low์ high ๊ฐ์ ์ ํ๊ณ , ์ด ๊ณผ์ ์ ๋ฐ๋ณตํด์ ๊ฐ์ ์ป์ด๋ด๋ฉด ๋๋ค.
ํ์ ๋ฒ์๊ฐ ๋ฐ์ผ๋ก ์ค์ด๋ค๋ฉด์ start์ end ๊ฐ์ ์ ํ๋ ๊ณผ์ ์ ๊ฑฐ์น๊ธฐ ๋๋ฌธ์ ์๊ฐ๋ณต์ก๋๊ฐ ๋ฎ๊ณ , ์์ฐจ์ ํ์๋ณด๋ค ๋น ๋ฅธ ํ์์ด ๊ฐ๋ฅํ๋ฏ๋ก ๋ฐฐ์ด์ ์์ ๊ฐ์๊ฐ ๋ง์ ๋ ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
๐น๏ธ Binary Search ๊ณผ์
1๏ธโฃ ๋ฐฐ์ด์ ์ค๊ฐ ๊ฐ์ ๊ณ์ฐํ์ฌ ์ฐพ๊ณ ์ ํ๋ ๊ฐ๊ณผ ๋น๊ตํ๋ค. ์ค๊ฐ ๊ฐ์ (low+high)/2
๋ก ๊ณ์ฐํ๋ค.
2๏ธโฃ ์ค๊ฐ ๊ฐ์ด ์ฐพ๊ณ ์ ํ๋ ๊ฐ๋ณด๋ค ์๋ค๋ฉด ์ค๊ฐ๊ฐ๋ณด๋ค 1๋งํผ ์ฆ๊ฐ์ํจ ๊ฐ์ low (low = mid+1)
๋ก ์ ํ๊ณ ์ค๊ฐ ๊ฐ ๊ธฐ์ค ์ค๋ฅธ์ชฝ ๋ถ๋ถ์์ ํ์์ ์งํํ๊ณ , ์ค๊ฐ๊ฐ์ด ์ฐพ๊ณ ์ ํ๋ ๊ฐ๋ณด๋ค ํฌ๋ค๋ฉด ์ค๊ฐ๊ฐ๋ณด๋ค 1๋งํผ ๊ฐ์์ํจ ๊ฐ์ high (high = mid-1)
๋ก ์ ํ๊ณ ์ค๊ฐ ๊ฐ ๊ธฐ์ค ์ผ์ชฝ ๋ถ๋ถ์์ ํ์์ ์งํํ๋ค.
3๏ธโฃ ์ด ๊ณผ์ ์ ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ ๊ตฌํ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
๐ฉ๐ป Binary Search ์ฝ๋ ๊ตฌํ
while๋ฌธ์ผ๋ก ๊ตฌํ
public class BinarySearchTest{
static int[] arr;
public static void main(String[] args){
arr = new int[]{1,3,5,7,9,11,13};
int idx = findBsIdx(9);
System.out.println(idx);
}
public static int findBsIdx(int target){
int low = 0;
int high = arr.length-1;
int mid;
int answer=0;
while(low<=high){
mid = (low+high)/2;
if(arr[mid]<target){
low = mid+1;
}else if(arr[mid]>target){
high = mid-1;
}else{
answer = mid;
}
}
if(answer==0) answer =-1; // ์ต์ข
ํ์ ๋ถ๊ฐํ ๊ฒฝ์ฐ -1 ๋ฐํ
return answer;
}
}
์ฌ๊ทํจ์๋ก ๊ตฌํ
public static int binarySearch(int[] arr, int low, int high, int key) {
if (high >= low) {
int mid = low + (high - low) / 2;
if (arr[mid] == key) {
return mid;
}
// ์ค๊ฐ ๊ฐ์ด ํค๋ณด๋ค ํฐ ๊ฒฝ์ฐ : ๋ฎ์ ์ธ๋ฑ์ค์ ์ค๊ฐ ์ธ๋ฑ์ค์์ 1์ ๋บ ๊ฐ์ ๊ฐ์ง๊ณ ํจ์๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํธ์ถ
else if (arr[mid] > key) {
return binarySearch(arr, low, mid - 1, key);
}
// ์ค๊ฐ ๊ฐ์ด ํค๋ณด๋ค ์์ ๊ฒฝ์ฐ : ์ค๊ฐ ์ธ๋ฑ์ค์ 1์ ๋ํ๊ณ ๋์ ์ธ๋ฑ์ค์ ํจ๊ป ํจ์๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํธ์ถ
else {
return binarySearch(arr, mid + 1, high, key);
}
}
// ๋์ ์ธ๋ฑ์ค๊ฐ ๋ฎ์ ์ธ๋ฑ์ค๋ณด๋ค ์์ผ๋ฉด ๋ฐฐ์ด์์ ํค๋ฅผ ์ฐพ์ง ๋ชปํ์์ ๋ํ๋ด๊ธฐ ์ํด -1์ ๋ฐํ
return -1;
}
๐ฉ๐ป Binary Search Lower & Upper
์ด๋ถ ํ์ ๋ฌธ์ ๋ฅผ ํ๋ค๋ณด๋ฉด lower bound์ upper bound๋ฅผ ์ด์ฉํด์ ํ์ด์ผ ํ๋ ๊ฒ๋ค์ด ์๋ค.
์์ ๊ทธ๋ฆผ์ฒ๋ผ ๋ด๊ฐ ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ด 3์ผ ๋, 3์ด ์์ํ๋ ๊ณณ (๊ฐ์ฅ ์ผ์ชฝ index)์ ์ฐพ๊ธฐ ์ํด lower bound๋ฅผ ์ฌ์ฉํ๊ณ ๋๋๋ ๊ณณ (๊ฐ์ฅ ์ค๋ฅธ์ชฝ index)์ ์ฐพ๊ธฐ ์ํด upper bound๋ฅผ ์ฌ์ฉํ๋ค.
Lower bound ๊ฐ์ ๊ฒฐ๊ณผ๋ 3๋ณด๋ค ์์ ๊ฐ์ด ๋์ค๊ธฐ ์ง์ ์ ์ธ๋ฑ์ค ๊ฐ์ด๋ค.
ํ์ง๋ง upper bound ๊ฐ์ ๊ฒฐ๊ณผ๋ 3์ด ๋ง์ง๋ง์ผ๋ก ์์นํ๋ ์ธ๋ฑ์ค๊ฐ ์๋, ๊ทธ ๋ค์ ์ธ๋ฑ์ค ๊ฐ์ ๊ฐ๊ฒ ๋๋ค.
๋ง์ฝ ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ด ๋ฐฐ์ด์ ์๋ ๊ฐ์ธ 8์ด๋ผ๋ฉด, 8๋ณด๋ค ์์ ๊ฐ ์ค ์ต๋์ธ 7์ ๋ํ๋ด๋ ์ธ๋ฑ์ค(8) ๋ฐ๋ก ๋ค์ ๊ฐ(9=last)์ด lower bound์ upper bound ๊ฐ์ด๋ค.
Lower Bound ๊ตฌํ
public static int lowerBound(target, arr) {
int left = 0;
int right = arr.length; //lower bound๊ฐ arr์ ๊ธธ์ด๋ฅผ ๋์ด๊ฐ ์ ์์
while (left < right) { // left๊ฐ right์ ๊ฐ์์ง๊ฒ ๋๋ฉด out of index๊ฐ ๋ ์ ์์
int mid = (left + right) / 2;
if (target <= arr[mid]) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
Upper Bound ๊ตฌํ
public static int upperBound(target, arr) {
int left = 0;
int right = arr.length;
while (left < right) {
int mid = (left + right) / 2;
if (target >= arr[mid]) {
left = mid + 1;
} else {
right = mid;
}
}
return left;
}
โณ ํ์๊ธฐ๋ฒ ์๊ฐ๋ณต์ก๋ ๋น๊ต
- ์์ฐจ์ ํ์ : ์ต์ ์ ๊ฒฝ์ฐ์๋ ๋๊น์ง ํ์ํด์ผ ํจ โก๏ธ (O(n))
- ์ด๋ถ ํ์ : ํ์ ๋ฒ์๊ฐ 1/2์ฉ ์ค์ด๋ฆ โก๏ธ (O(log n))
์ฐธ๊ณ
https://adjh54.tistory.com/187
https://enumclass.tistory.com/178
'์๊ณ ๋ฆฌ์ฆ > ๐๏ธ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Bellman-Ford (๋ฒจ๋ง-ํฌ๋) (0) | 2023.09.08 |
---|---|
LCA (์ต์๊ณตํต์กฐ์) (0) | 2023.09.04 |
Floyd-Warshall (ํ๋ก์ด๋ ์์ ) (0) | 2023.08.29 |
Union Find (์ ๋์จ ํ์ธ๋) (0) | 2023.08.29 |
Dijkstra (๋ค์ต์คํธ๋ผ) (0) | 2023.03.03 |