이진 탐색 (Binary Search)
- Algorithm/Concept
- 2022. 3. 7.
반응형
728x90
반응형
이진 탐색
정렬되어 있는 리스트에서 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 방법
- 탐색 범위를 반으로 좁혀가면서 탐색
- 이진 탐색을 하기 위한 전제 조건(precondition) : 탐색을 실시하기전에 오름차순 정렬이 되어있어야 한다.
동작 예시
0) 오름차순 정렬된 데이터 중에서 값이 4인 원소를 찾아보자.
1) 시작점 0, 끝점 9, 중간점 (9 / 2 = 4)
2) 중간점보다 4가 작으므로 시작점 0, 끝점 3, 중간점 1
3) 중간점보다 4가 크므로 시작점 2, 끝점 3, 중간점 2
예제코드
import java.util.Scanner;
public class M14_이진탐색 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 원소의 개수(n)와 찾고자 하는 값(target)을 입력받기
int n = sc.nextInt();
int target = sc.nextInt();
// 전체 원소 입력받기
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
// 이진 탐색 수행 결과 출력
int result = binarySearch(arr, target, 0, n - 1);
if (result == -1) {
System.out.println("원소가 존재하지 않습니다.");
} else {
System.out.println(result + 1);
}
}
// 순차 탐색 소스코드 구현
public static int binarySearch(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;
}
}
예제코드 (재귀)
public static int binarySearch(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 binarySearch(arr, target, start, mid - 1);
} else {
// 중간점의 값보다 찾고자 하는 값이 큰 경우 오른쪽 확인
return binarySearch(arr, target, mid + 1, end);
}
}
반응형
'Algorithm > Concept' 카테고리의 다른 글
선택 정렬 (0) | 2022.03.07 |
---|---|
다이나믹 프로그래밍 (0) | 2022.03.07 |
BFS (Breadth-First Search) (0) | 2022.03.07 |
큐 (Queue) (0) | 2022.03.07 |
DFS (Depth-First Search) (0) | 2022.03.07 |