Notice
Recent Posts
Recent Comments
Link
munjji 님의 블로그
[알고리즘] 이분 탐색 (binary search) 본문
이분 탐색 (binary search)
정렬된 배열 안에서 특정 원소를 찾을 때,
인덱스 i부터 j의 중간값을 비교해서 중간값이 찾는 원소가 아니라면 인덱스의 i와 j를 재정의 하는 방법으로 탐색한다.
인덱스 i와 j를 정할 때 마다 탐색 범위는 반으로 줄어든다.
이분 탐색 방법
- 처음 범위는 0부터 마지막 인덱스까지다.
- 이때 중간 인덱스를 mid라고 한다.
- mid와 찾는 원소를 비교한다.
- 찾는 원소와 mid 인덱스의 값이 같다면 탐색을 종료한다.
- mid 인덱스의 값 < 찾는 원소일 때는 left = mid + 1로 하여 2를 반복한다.
- mid 인덱스의 값 > 찾는 원소일 때는 right = mid - 1로 하여 2를 반복한다.
- 만약 left > right이 된다면 해당 배열에 찾는 원소가 없는 것이다.
이분 탐색 구현 (java)
1. 반복문
public static boolean BSearch(int[] arr, int target) { // target: 찾으려는 값
int left = 0;
int right = arr.length - 1;
int mid;
while (left <= right) {
mid = (left + right) / 2;
if (arr[mid] < target) left = mid + 1;
else if (arr[mid] > target) right = mid - 1;
else return true;
}
return false;
}
2. 재귀
public static boolean BSearchRecursive(int[] arr, int target, int left, int right) {
if(left > right)
return false;
int mid = (left + right) / 2;
if (arr[mid] < target)
return BSearchRecursive(arr, target, mid +1, right);
else if (arr[mid] > target)
return BSearchRecursive(arr, target, left, mid - 1);
else
return true;
}
이분 탐색 시간 복잡도
O(log N)
탐색 범위를 매번 "절반"으로 줄이기 때문
왜 log N인가?
예를 들어 N = 16일 때
16 -> 8 -> 4 -> 2 -> 1 총 4번이면 끝난다.
이것은 2^4 = 16 즉, k번 반복하면 2^k = N이므로 k = log2(N)이다.
이분 탐색의 장점
- 매우 빠르다.
- 대용량 데이터에 강하다.
- 매개변수 탐색에 활용 가능하다.
이분 탐색의 단점
- 반드시 정렬되어 있어야 사용할 수 있다.
- 배열 구조에서만 효율적이다.
'알고리즘' 카테고리의 다른 글
| [알고리즘] BFS 어떨 때 사용해야할까? (0) | 2026.03.05 |
|---|---|
| [알고리즘] 다익스트라 알고리즘 (Dijkstra) (0) | 2026.03.03 |
| [알고리즘] 플로이드-워셜(Floyd–Warshall) (0) | 2026.02.26 |
| [알고리즘] 최소 신장 트리 (MST) (feat. kruskal, Prim 알고리즘) (0) | 2026.02.25 |