이진 탐색이란?
이진 탐색이란 정렬되어 있는 데이터에서 특정한 값을 찾아내는 알고리즘이다.
- 이진 탐색은 탐색 범위를 반으로 나누어 찾는 값을 포함하는 범위를 좁혀가는 방식이다. 주로 배열의 인덱스를 기준으로 배열 내의 값을 탐색하는 데 사용되고, 리스트, 트리 등에서도 사용한다.
- 일정한 순서로로 정렬된 구조에서만 사용할 수 있기 떄문에 정렬된 리스트나 트리에서 사용할 수 있다
- 이진 탐색의 시간 복잡도는 O(log n)으로 배열의 크기에 비례하여 실행 시간이 빨라진다.
-> 대용량 데이터에서 특정 값의 위치를 찾는 데 용이하다.
이진 탐색의 동작 방식
- 정렬된 배열에서 중간 인덱스를 찾는다.
- 찾으려는 값과 중간 값을 비교한다.
- 찾으려는 값이 중간 값보다 작으면 왼쪽 부분 배열을 크면 오른쪽 부분 배열을 탐색한다.
- 탐색 범위를 반으로 줄인다.
- 더 이상 탐색할 값이 없을 때까지 위 과정을 반복한다.
public class BinarySearch {
stsatic int[] arr = {1, 3, 5, 7, 8, 10, 22, 37, 57, 88};
public static void main(String[] args) {
System.out.println(binarySearch1(5, 0, arr.length-1)); // 2
System.out.println(binarySearch2(22, 0, arr.length-1)); // 6
}
// 재귀적 탐색
static int binarySearch1(int key, int low, int high) {
int mid;
if(low <= high) {
mid = (low + high) / 2;
if(key == arr[mid]) { // 탐색 성공
return mid;
} else if (key < arr[mid]) {
return binarySearch1(key, low, mid-1); // 왼쪽 부분
} else {
return binarySearch1(key, mid+1, high); // 오른쪽 부분
}
}
return -1; // 탐색 실패
}
// 반복적 탐색
static int binarySearch2(int key, int low, int high) {
int mid;
while(low <= high) {
mid = (low + high) / 2;
if (key == arr[mid]) {
return mid;
} else if (key < arr[mid] {
high = mid - 1;
} else {
low = mid + 1;
}
}
return -1; // 탐색 실패
}
}
'코테' 카테고리의 다른 글
[Java] 백준 : 2805 - 나무 자르기 (1) | 2024.12.09 |
---|---|
[Java] 백준 : 1654 - 랜선 자르기 (1) | 2024.11.29 |
[Java] 백준 : 9093번 - 단어 뒤집기 (0) | 2024.11.13 |
[Java] 백준 : 1966번 - 프린터 큐 (3) | 2024.11.05 |
[Java] 프로그래머스 : 같은 숫자는 싫어 (0) | 2024.11.01 |