이분 탐색(Binary Search)

이진 탐색이라고도 하며 오름차순으로 정렬된 리스트에서 탐색 범위를 절반씩 좁혀가며 탐색하는 방법이다.
데이터가 정렬되어 있어야만 사용할 수 있다.

과정

1. 최소값과 최대값을 설정한다.
2. 최소값과 최대값의 중간값을 구한다.
3. 중간값이 찾으려 하는 값이면 종료하고 찾으려하는 값보다 크면 최대값을 중간값-1로 설정하고 작으면 최소값을 중간값+1로 설정하여 반복한다.

코드


Upper Bound/Lower Bound

이분 탐색은 찾고자 하는 값이 없으면 탐색에 실패한다.
이를 해결하기 위해 찾고자 하는 값이 존재하지 않을 수도 있는 경우를 처리하기 위해 Upper Bound와 Lower Bound가 사용된다.
Upper Bound는 찾고자 하는 값보다 큰 값이 처음 나타나는 위치를 반환한다.
Lower Bound는 찾고자 하는 값 이상이 처음 나타나는 위치를 반환한다.
두 개념 모두 이분 탐색의 조건을 조금 변경하면 된다.

이분 탐색과의 차이점

이분 탐색과 Upper/Lower Bound에는 구간 정의의 차이가 있다.
이분 탐색의 구간 정의는 start <= end이 반면 Upper/Lower Bound는 start < end이다.
즉, 이분 탐색은 start > end일 때 멈추고 Upper/Lower Bound는 start == end일 때 멈춘다.
왜냐하면 Upper/Lower Bound는 조건을 만족하는 최솟값 위치를 찾는 것이 목적이다.
즉, 정확한 값을 찾는 게 아니라 경계를 찾는 것이다.
따라서 값을 찾았다고 해도 멈추지 않고 더 왼쪽/오른쪽으로 이동하며 start == end가 되면, 그 위치가 곧 원하는 경계선이다.
반면 이분 탐색은 정확한 값을 찾는 것이 목적이다.
중간값이 목표한 값이면 바로 반환하고 그렇지 않으면 왼쪽/오른쪽 절반을 완전히 버리기 위해 구간을 한 칸씩 줄여 나간다.
start > end가 되면 탐색할 범위가 없다는 뜻이다.

Upper Bound

Lower Bound