start, end, mid)를 사용하여 탐색한다. 찾으려는 데이터와 중간점 위치에 있는 데이터를 반복적으로 비교해서 원하는 데이터를 찾는 것이 이진 탐색의 과정이다.O(logN) 이란? : 입력 크기(N)가 커질 때 연산 횟수가 logN 에 비례해서 증가하면 시간 복잡도는 O(logN)과정을 정리를 해보자면
1) 데이터가 정렬되어 있어야 사용가능
2) 정렬되어 있는 배열에서 특정한 값을 찾아내는 알고리즘
3) 찾고자 하는 값이X라고 가정했을때
4)X가 중간 값보다 작으면 중간값 기준으로좌측탐색
5)X가 중간 값보다 크면 중간값 기준으로우측탐색
6) 그리고 이 방법으로 다시 중간의 값을 선택하여X값을 비교 하며 찾을때까지 이 과정을 반복이해하기 쉽게 그림으로 한번 봐보자 🖼


어때요 ? 이해가 팍팍 되시쥬 ? ㅎㅎ steps 차이 보소 ...
만약에 40억개에 데이터를 찾으면 선형으로 검색시에 컴퓨터 터질듯
그런데 이진탐색을 사용하게 되면 최~~~대 32번 만에 찾을 수 있다. 크.. 외쳐 갓 이진탐색!!! 🥳
function binarySearch(array, targetValue) {
let left = 0;
let right = array.length - 1;
while(left <= right) {
let mid = Math.floor((left + right) / 2);
if(array[mid] === targetValue) {
return array[mid];
}
else if(array[mid] > targetValue) {
right = mid - 1;
}
else if(array[mid] < targetValue) {
left = mid + 1;
}
}
return notFound;
}
1)binarySearch 함수는 매개변수로 array 와 탐색을 원하는 숫자 targetValue 를 받는다.
2) 함수 내부에서 left와 right 를 각각 배열의 0번째, 마지막 인덱스로 초기화를 해준다.
3) while 문을 사용하여 left가 right 보다 작거나 같을 동안 탐색을 수행
4) while 문 안에서는 mid의 값을 구해주고 조건문을 통해 mid에 해당하는 인덱스의 요소가 탐색하고 있는 값과 같은지 비교
5) 값이 같을 경우는 값을 반환하고 탐색 종료
6) mid 인덱스의 요소 > 탐색하는 값 → right의 값을 미드보다 1 작은 값으로 설정(right = mid - 1)
7) mid 인덱스의 요소 < 탐색하는 값 → left의 값을 미드보다 1 큰 값으로 설정(left = mid + 1)
8) while 문이 끝날 때까지 원하는 값을 찾지 못하면 while 문을 빠져나와 notFound 를 반환하고 탐색 종료
1) 최선일 경우 O(1)
2) 평균 : O(logN)
3) 최악 : O(logN)