개요
최장증가부분수열에 대해 공부하다가 이분탐색이 필요하게 되어 익히게 됐다.
특징
보통 선형탐색의 경우 O(N)이지만
이진 탐색은 계속 반씩 나누어 나머지 한쪽은 버리는 사이클을 이용하여 탐색을 진행하기 때문에
O(log N)으로 탐색이 가능하다.
단 단점은 정렬된 컨테이너에서만 가능하다.
또한 정확히 반으로 나누지 않을 경우 무한 루프에 빠지는 경우가 있다.
왜 사용하는가?
선형 탐색보다 빠른 속도로 탐색을 진행하려고!
구현
Binary search
int BinarySearch(const int * arr, const int & size, const int & f)
{
int s = 0, e = size, m;
while (s <= e)
{
m = (s + e) / 2;
//중앙 값이 찾는 값인지 확인
if (arr[m] == f) return m;
//시작 or 끝 인덱스 조정
if (arr[m] < f) s = m + 1;
else e = m - 1;
}
return -1;
}
시작 인덱스(s), 중앙 인덱스(m), 끝 인덱스(e) 를 의미하는 정수형 변수로 돌아가게 된다.
m은 항상 (s + e) / 2 로 구할 수 있고
m이 찾는 값보다 크다면 끝 지점을 m으로 옮기고
m이 찾는 값보다 작다면 시작 지점을 m으로 옮긴다.
이렇게 진행하다보면 어느 순간 s와 e가 겹치게 되는데
이때 끝내버리면 m이 s와 e가 겹친 인덱스를 한번도 찾지 못하게 되어서
while ( s < e ) 가 아닌 while ( s <= e ) 를 사용했다.
그 후 교차가 되어서 교차가 되면 끝나고 찾지 못했다는 의미로 -1을 반환하는 형식으로 구현했다.
'코딩 테스트 > 알고리즘' 카테고리의 다른 글
Lower bound & Upper bound (0) | 2022.08.25 |
---|