개념
이진 검색 알고리즘은 오름차순으로 정렬된 리스트에서 특정한 값의 위치를 찾는 알고리즘입니다.
장점 | 검색이 반복될 때마다 목표값을 찾을 확률이 두배가 되므로 속도가 빠릅니다. |
단점 | 검색 원리상(중간 값을 찾아야 하기에) 정렬된 리스트에만 사용할 수 있습니다. |
알고리즘 과정
- 배열의 중간 값을 임의의 값으로 선택
- 중앙 값과 찾고자 하는 값의 크고 작음을 비교
- 중앙 값 = 찾는 값 : 값을 찾았으니 검색 종료
- 중앙값 > 찾는 값 : 중앙값 기준 배열의 왼쪽 구간을 대상으로 탐색
- 중앙값 < 찾는 값 : 중앙값 기준 배열의 오른쪽 구간을 대상으로 탐색
- 값을 찾거나 간격이 0이 될때까지 반복
- 리스트에서 검색할 값과 같은 요소 발견한 경우(검색 성공)
- 검색할 범위가 더 이상 없을 경우(검색 실패)
[ 0. 선행조건 ]
배열 : arr[1,2,3,4,5,6,7]
찾는 값 : 5
[ 1. 배열의 중간 값을 임의의 값으로 선택 ]
key(찾는 값) : 5
mid(중앙 값) : 4
검색 범위 : 1, 2, 3, 4, 5, 6, 7
[ 2 .중앙 값과 찾고자 하는 값의 크고 작음을 비교 ]
중앙값(4) < 찾는 값(5) : 중앙값 기준 배열의 오른쪽 구간을 대상으로 탐색
(값을 찾거나 간격이 0이 될때까지 반복)
key(찾는 값) : 5
mid(중앙 값) : 6
검색 범위 : 4, 5, 6, 7
중앙값(6) > 찾는 값(5) : 중앙값 기준 배열의 왼쪽 구간을 대상으로 탐색
(값을 찾거나 간격이 0이 될때까지 반복)
key(찾는 값) : 5
mid(중앙 값) : 5
검색 범위 : 4, 5, 6
[ 3. 값을 찾거나 간격이 0이 될때까지 반복 ]
💡 TIP. 중앙 값 계산식
int mid = (low + high) / 2
//만약 배열의 크기가 커지게 된다면
//low + high를 했을 때 int 범위를 벗어날 수 있기에 이렇게 사용하는편이 좋음
int mid = low + (hight-low) / 2
시간 복잡도 및 빅오 표기
Algorithm | Average | Worst |
Binary Search | Θ(log n) | Θ(log n) |
💻 이진 탐색 알고리즘 구현 with JAVA
public int binarySearch(int[] arr, int target) {
int start = 0;
int end = arr.length - 1;
int mid = 0;
while (start <= end) {
mid = (start + end) / 2;
if (target == arr[mid]) {
return mid;
}else if (arr[mid] < target) {
start = mid + 1;
}else if (target < arr[mid]) {
end = mid - 1;
}
}
throw new NoSuchElementException("can't find target.");
}
출처
- https://ko.wikipedia.org/wiki/이진_검색_알고리즘
- https://yoongrammer.tistory.com/75
'Algrithm' 카테고리의 다른 글
[ALGORITHM] 동적 계획법 (Dynamic Programming) (0) | 2022.07.04 |
---|---|
[ALGORITHM] 플로이드-워셜 (Floyd-Warshall) (0) | 2022.06.30 |