이진 탐색
이진 탐색은 배열 내부의 데이터가 정렬되어 있어야만 사용할 수 있다.
탐색 범위를 절반씩 좁혀가며 데이터를 탐색한다.
이진 탐색의 기본 원리이다.
이진 탐색은 변수 3개를 사용한다. (시작점, 끝점, 중간점)
찾으려는 데이터와 중간점 위치에 있는 데이터를 반복적으로 비교해서 원하는 데이터를 찾는다.
ex) 찾고자 하는 원소 : 4
1) 시작점, 끝점 사이 중간점을 정한다 -> 중간점[4]와 찾으려는 데이터 4를 비교한다 -> 중간점 이후의 값은 버리고 끝점을 [3]으로 옮긴다.
| 0 | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 |
⬆️ ⬆️ ⬆️
시작점[0] 중간점[4] 끝점[9]
중간점 : (시작점 + 끝점) / 2
2) 중간점[1]과 찾으려는 데이터 4 비교 -> 중간점 이전 값 버리고 시작점을 [2]로 옮긴다.
| 0 | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 |
⬆️ ⬆️ ⬆️
시작점[0] 중간점[1] 끝점[3]
3) 중간점과 찾으려는 데이터가 동일하므로 탐색 종료
| 0 | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 |
⬆️ ⬆️
시작점[2] 끝점[3]
중간점[2]
시간 복잡도 : O(log N)
이진 탐색 구현 방법 2가지
1. 재귀 함수
static int binary_search(int[] arr, int target, int start, int end) {
if(start> end) return -1;
int mid = (start + end) / 2;
// 찾은 경우 중간점 인덱스 반환
if(arr[mid] == target) return mid;
// 중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인
else if(arr[mid] > target)
return binary_search(arr, target, start, mid - 1);
// 중간점의 값보다 찾고자 하는 값이 큰 경우 오른쪽 확인
else
return binary_search(arr, target, mid + 1, end);
}
2. 반복문
static int binary_search(int[] arr, int target, int start, int end) {
while(start <= end) {
int mid = (start + end) / 2;
// 찾은 경우 중간점 반환
if(arr[mid] == target) return mid;
// 중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인
else if(arr[mid] > target)
end = mid - 1;
// 중간점의 값보다 찾고자 하는 값이 큰 경우 오른쪽 확인
else
start = mid + 1;
}
return -1;
}
결론
코딩테스트에서 탐색 범위가 2,000만을 넘어가면 이진 탐색으로 문제에 접근해보자.
'코딩 테스트(Coding Test) > 알고리즘 개념' 카테고리의 다른 글
| 최단경로 - 다익스트라 알고리즘 (0) | 2024.12.05 |
|---|---|
| 다이나믹 프로그래밍(DP) (0) | 2024.12.04 |
| 정렬 (2) | 2024.11.25 |
| DFS / BFS (0) | 2024.11.22 |
| 분할 정복(Divide and Conquer) - Merge Sort (2) | 2024.11.13 |