Computer Science/알고리즘

[알고리즘] 이분탐색(Binary Search)

inseoking 2023. 3. 15. 15:32

개인의 짧은 식견으로 작성했으니, 많은 조언 부탁드립니다.

설명

  • 이분탐색은 기본적으로 Array와 같은 자료 구조에서 특정 값을 찾아낼 때 쓰인다.
  • 찾고자 하는 값과, 현재 보고 있는 값을 비교하여 왼쪽과 오른쪽으로 탐색 범위를 쪼개 다시 탐색하는 과정을 거친다.
  • 보고 있는 값과 찾고자 하는 값의 대소관계가 분명해야 하기 때문에, 이분 탐색을 사용하기 위해서는 배열이 정렬되어 있어야 한다.
  • 한번 탐색마다 탐색 범위를 반으로 축소하기 때문에(left or right), O(nlogn)의 TC를 갖는다.

사용처

  • 배열 속의 특정 값을 찾고자 할 때.
  • 배열의 값들을 활용하여 찾아야 할 값에 특정 범위 내의 최적해를 찾을 때.

Code

  • 가장 기본적인 이분탐색 코드는 다음과 같다.

```cpp
#include
#include

using namespace std;

int main(){
//Data - 크기가 5인 배열을 선언.
int arr[] = {1,4,2,6,8};

// 배열이 정렬되어 있어야 이분 탐색을 사용할 수 있으므로 배열 정렬.
sort(arr,arr+5);

// 찾고자 하는 값, 값의 유무를 판단할 boolean 변수 선언
int ans = 2; bool result = false;

//처음 시작할 때 위치는 양 끝 점을 위치로 한다.
int left = 0; right = 5 - 1;

//left index가 right index를 넘어갈 경우, 배열의 모든 범위를 탐색한 것이기 때문에 종료.
while(left <= right){
 //left와 right index의 중간 값을 선언하고, 이 값을 찾고자하는 ans와 비교.
 int mid = (left + right) / 2;

    //1. 찾고자 하는 값보다 중간 값과 같으므로, result 변수값을 변경하고 루프에서 빠져나옴.
    if(mid == ans){
     result = true;
        break;
    }
    //2. 현재 값이 찾고자 하는 값보다 크므로, 현재 값보다 작은 범위에서 다시 탐색을 시작.
    else if(mid > ans) right = mid - 1;
    //3. 2번의 반대 개념이므로 현재 값보다 큰 범위에서 다시 탐색.
    else left = mid + 1;
}

cout << result << endl;

return 0;

}