정의
Quote
이진 탐색 알고리즘 (binary search algorithm) 은 오름차순으로 정렬된 리스트에서 특정한 값의 위치를 찾는 알고리즘이다. 처음 중간의 값을 임의의 값으로 선택하여, 찾고자 하는 값의 크고 작음을 비교하는 방식을 채택하고 있다. 처음 선택한 중앙값이 만약 찾는 값보다 크면 그 값은 새로운 최댓값이 되며, 작으면 그 값은 새로운 최솟값이 된다. 검색 원리상 정렬된 리스트에만 사용할 수 있다는 단점이 있지만, 검색이 반복될 때마다 목표값을 찾을 확률은 두 배가 되무로 속다가 빠르다는 장점이 있다.
탐색 알고리즘(search-algorithm) 중 정렬된 배열을 탐색할 때 가장 적합.
정렬된 데이터에서 특정한 값을 찾아내는 알고리즘
- 탐색 범위를 반으로 나누어 찾는 값을 포함하는 범위를 좁혀가는 방식으로 동작한다.
- 주로 배열의 인덱스르르 기준으로 배열 내의 값을 탐색하는데 사용되지만, 리스트, 트리 등에서도 사용할 수 있다.
- 반드시 원소들이 일정한 순서로 정렬된 구조에서만 사용할 수 있다.
- 시간 복잡도는 O(log n)이다. 대용량 데이터에서 특정값의 위치를 찾는데 용이하다.
원리
- 정렬된 배열에서 중간 인덱스(
mid
)를 찾는다. - 찾으려는 값(
target
)과 중간 값(mid_val
)을 비교한다. target
이mid_val
보다 작으면mid
를 기준으로 왼쪽 부분 배열을 탐색한다.target
이mid_val
보다 크면mid
를 기준으로 오른쪽 부분 배열을 탐색한다.- 탐색 범위를 반으로 줄인다.
- 탐색 범위가 더 이상 없을 때까지 위 과정을 반복한다.
예시
[! tip]
파이썬의 경우
bisect
모듈의bisect_left
혹은bisect_right
함수를 통해 쉽게 구현할 수 있다.만약 탐색 시간을 줄여야 하는 상황에서 메모리를 사용할 수 있는 상황이 아니라면 이진 탐색을 활용할 수 있는지 고민해 보아야 한다.
이진 탐색 트리 를 활용하여 배열 뿐만이 아닌 트리구조에서도 활용할 수 있다.