4-1. 이분탐색 (Binary Search)
이분 탐색(Binary Search)은 이름에서 부터 알 수 있듯이 2개로 나누는 탐색 방법입니다.
아마 술자리에서 업다운 을 해보신 분들은 익숙한 알고리즘일수도 있습니다. 정렬 전처리를 필요로 하며, 다음과 같은 과정을 거칩니다.
- 정렬 여부 확인 및 정렬
- 시작점과 끝점 확인 (lo, hi 또는 st, ed 또는 l, r 표현)
- 시작점과 끝점의 중간 포인트 산술 평균 계산 ((lo + hi) // 2)
- 중간 포인트에서 결과와 찾고자 하는 결과 비교
- 비교에 따라 시작점이나 끝점을 중간점으로 변경
- 결론적으로 범위가 1/2로 줄어들며 탐색
- 최후에 1개가 남으면 결과가 확정
간단하게 코드로 작성하면 다음과 같습니다.
def binary_search(lst, value, N):
lo, hi = 0, N-1
while lo <= hi :
mid = (lo + hi) // 2
if lst[mid] == value : return mid
if lst[mid] < value : lo = mid+1
else : hi = mid-1
return False
보통 3가지 방법으로 사용합니다. 과정은 거의 유사하나 task에 따라 적재적소에 사용하면 됩니다.
- 존재 유무 확인
- lower bound : 찾고자 하는 값 이상이 처음 나타나는 위치
- upper bound : 찾고자 하는 값보다 큰 값이 처음으로 나타나는 위치
이를 활용하면 조금 어렵지만 이런 문제를 해결할 수 있습니다.
bisect.bisect 라이브러리 사용 가능
4-2. 파라매트릭 서치 (Parametric Search)
이분 탐색의 조금 심화된 버전으로 보면 됩니다.
4-3은 교양 알고리즘 지식으로 알아두면 좋습니다. 종종 대회에는 사용하는 알고리즘이기도 하나 메이저한 알고리즘은 아닙니다.
4-3. 삼분탐색 (Ternary Search)
삼분 탐색은 상태를 3개로 나누어서 살펴보는 방법입니다. 흔히 상태가 오목/볼록 그래프일때 사용합니다.