이분 탐색 (Binary Search)

👑 이분 탐색 (Binary Search)

이분 탐색정렬된 리스트에서 특정 항목을 찾기 위한 효율적인 탐색 알고리즘이다.

반드시 정렬된 상태의 리스트에서 진행해야 올바른 탐색이 가능하다.


- 두 개의 포인터를 사용하여 첫 요소와 마지막 요소를 가리키게 한다.
  (left, right)

- 현재 리스트 구간의 중간점을 계산한다.
  mid = (left + right) / 2

- 중간 요소와 타겟 값을 비교한다.

    1. 같음 → 항목을 찾은 것

    2. mid보다 작음 → 검색 범위를 왼쪽 절반으로 줄임 (left ~ mid)

    3. mid보다 큼 → 검색 범위를 오른쪽 절반으로 줄임 (mid ~ right)

- left가 right 보다 커지면, 리스트에 찾고자 하는 값이 없다는 뜻.


  • $ O(log n) $ 시간이 걸리며 $ O(n) $ 의 선형 탐색보다 훨씬 빠르게 동작한다.

  • 정렬된 리스트에서만 작동하며, 정렬을 위한 $ O(n log n) $ 의 시간 복잡도를 소모한다.


💡 구현 (C++)

#include <iostream>
#include <vector>

int binarySearch(const std::vector<int>& arr, int target) {
    int left = 0;
    int right = arr.size() - 1;

    while (left <= right) {
        int mid = (left + right) / 2;

        // 중간 요소와 타겟 값이 같은 경우 리턴
        if (arr[mid] == target) return mid;

        // 타겟 값이 중간값보다 큰 경우
        if (arr[mid] < target) left = mid + 1;
        
        // 타겟 값이 중간값보다 작은 경우
        else right = mid - 1;
    }

    // while 문을 통과했다면 타겟이 배열에 없다는 뜻
    return -1;
}

int main() {
    std::vector<int> arr = {2, 3, 4, 10, 40};
    int target = 10;
    int result = binarySearch(arr, target);

    cout << result;

    return 0;
}


💡 Binary Search in C++ STL

C++에서는 <algorithm> 헤더를 include 할 경우 binary_search를 쉽게 사용할 수 있도록 한다.

범위와 타겟 값을 인자로 주면 범위 내 타겟이 들어있는지 여부를 부울 값으로 리턴해준다. 물론 범위

내의 값들은 반드시 오름차순으로 정렬되어 있어야 한다.

#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    std::vector<int> arr = {2, 3, 4, 10, 40};
    int target = 10;
    bool result = binary_search(arr.begin(), arr.end(), 10);

    cout << result;

    return 0;
}

Leave a comment