본문 바로가기
알고리즘/이론

이진 탐색 (binary search) 알고리즘

by 머리올리자 2021. 4. 13.

순차 탐색 : 리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 확인하는 방법

이진 탐색 : 정렬되어 있는 리스트에서 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 방법

    -이진 탐색은 시작점, 끝점, 중간점을 이용하여 탐색 범위를 설정

 

중간점이 두 개라면 소수점 이하를 제거해서 중간점을 설정한다.

 

단계마다 탐색 범위를 2로 나누는 것과 동일하므로 연산 횟수는 log_2*N에 비례

 

이진 탐색은 탐색 범위를 절반씩 줄이며, 시간 복잡도는 O(logN)을 보장

 

 

4를 찾는다고 가정

 

중간점이랑 비교해서 중간보다 값이 작으면 중간점을 포함해서 오른쪽 범위를 볼 필요가 없다

 

이번에 보면 중간점이랑 비교해서 값이 작기 때문에 중간점을 포함해서 왼쪽 범위를 볼 필요가 없다.

 

원하는 값을 찾았기 때문에 탐색을 종료해도 된다.

 

단계마다 탐색 범위를 2로 나누는 것과 동일하므로 연산 횟수는 아래에 비례한다.

 

이진 탐색은 탐색 범위를 절반씩 줄이며 O(logN)을 보장

 

C++ 코드

#include <iostream>
#include <vector>

using namespace std;

// 이진 탐색 소스코드 구현(재귀 함수)
int binarySearch_recursive(vector<int>& arr, int target, int start, int end) { // 참조자로 list를 받아 시간복잡도를 줄인다.
    if (start > end) return -1;
    int mid = (start + end) / 2;
    // 찾은 경우 중간점 인덱스 반환
    if (arr[mid] == target) return mid;
    // 중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인
    else if (arr[mid] > target) return binarySearch_recursive(arr, target, start, mid - 1);
    // 중간점의 값보다 찾고자 하는 값이 큰 경우 오른쪽 확인
    else return binarySearch_recursive(arr, target, mid + 1, end);
}


int binarySearch_iter(vector<int>& arr, int target, int start, int end) { // 참조자로 list를 받아 시간복잡도를 줄인다.
    while (start <= end)
    {
        int mid = (start + end) / 2;
        // 찾은 경우 중간점 인덱스 반환
        if (arr[mid] == target) return mid;
        // 중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인
        else if (arr[mid] > target) end = mid - 1;
        // 중간점의 값보다 찾고자 하는 값이 큰 경우 오른쪽 확인
        else start = mid + 1;
    }
    return -1;
}

int n, target;
vector<int> arr;

int main(void) {
    // n(원소의 개수)와 target(찾고자 하는 값)을 입력받기 
    cout << "원소의 개수 입력 : ";
    cin >> n;
    cout << "찾고자 하는 값? : ";
    cin >> target;
    // 전체 원소 입력받기 
    cout << "전체 원소 입력 : ";
    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        arr.push_back(x);
    }
    // 이진 탐색 수행 결과 출력 
    int result = binarySearch_iter(arr, target, 0, n - 1);
    cout << endl << endl;
    if (result == -1) {
        cout << "원소가 존재하지 않습니다." << '\n';
    }
    else {
        cout << result + 1 << '\n';
    }
}

 

파라메트릭 서치 : 최적화 문제를 결정 문제('예' 혹은 '아니오')로 바꾸어 해결하는 기법

  - 예시 : 특정한 조건을 만족하는 가장 알맞은 값을 빠르게 찾는 최적화 문제

 

 

내용 및 코드 참고

www.youtube.com/watch?v=94RC-DsGMLo&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=5

 

'알고리즘 > 이론' 카테고리의 다른 글

최단 경로 문제  (0) 2021.04.15
다이나믹 프로그래밍(Dynamic Programming)  (0) 2021.04.13
정렬(sorting) 알고리즘  (0) 2021.04.13
재귀(recursive) 함수  (0) 2021.04.12
queue 자료구조 설명 및 구현(c++)  (0) 2021.04.09