본문 바로가기

algorithm/이론

이분 탐색

이분 탐색

 

이분 탐색은 탐색 기법의 하나입니다. 탐색 범위를 두 부분으로 분할 하며 탐색한다 하여 이분 탐색이라고 이름 지어졌습니다. 이분 탐색의 핵심은 왼쪽 경계, 오른쪽 경계, 가운데를 어떻게 두느냐가 핵심입니다. 설명의 편의를 위해 left(=왼쪽 경계) , right(=오른쪽 경계) , mid(=가운데) 라고 하겠습니다.

 

탐색 방법은 아래와 같습니다.

1. left 값을 탐색 범위의 최소 인덱스로 지정합니다.

2. right 값을 탐색 범위의 최대 인덱스로 지정합니다.

3. mid의 값을 (left + right)/2로 지정합니다.

4. 찾으려는 값이 mid와 같은지 비교해줍니다. (같을 시 반복 종료)

5. 찾으려는 값이 mid보다 높다면 left = mid + 1로 초기화한 후 1 ~ 4의 step을 반복합니다. 

6. 찾으려는 값이 mid보다 낮다면 right = mid - 1로 초기화한 후 1 ~ 4의 step을 반복합니다. 

이러한 방법으로 탐색을 진행하면 O( log(n))의 시간 복잡도가 걸립니다.

 

 

 

아래는 이분 탐색의 시각화입니다.

 

 

[코드]

#include <iostream>

using namespace std;
 
int main(void){
 
    int target; // 찾으려는 값
    int result = 0; //target 인덱스 값
 
    int index_arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
 
    scanf("%d", &target);
    
    int left = index_arr[0];
    int right = index_arr[9];
 
    while (left <= right){
 
        int mid = (left + right) / 2;
        
        if (index_arr[mid] > target){
            right = mid - 1;
        }
        else if (index_arr[mid] < target){
            left = mid + 1;
        }
        else if (index_arr[mid] == target)
        {
            result = mid;
            break;
        }
 
    }
 
    printf("%d\n", result);
 
    return 0;
}

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

서로소 집합(Disjoint Set, Union-Find)  (0) 2021.04.15
최소 신장 트리(Minimum Spanning Tree)  (0) 2021.04.14
(C++ STL) priority_queue  (0) 2020.10.18
(C++ STL) lower_bound, upper_bound  (0) 2020.10.10