본문 바로가기

자료구조를 알아보자

[탐색] 이분탐색 Binary Search

이분탐색 (Binary Search)

오름차순으로 정렬된 N개의 수열에서 탐색하는 알고리즘이다.

탐색을 진행할수록 수의 범위는 반으로 줄어든다.

시간복잡도는 O(logN)


이분탐색 순서는 다음과 같다.

1. 오름차순으로 정렬하기

2. left는 배열의 첫 인덱스(0), right는 배열의 마지막 인덱스(N-1), mid는 (left + right) / 2로 지정

3. mid와 찾고자하는 값(val) 비교

mid == val : 찾음!

mid < val : left = mid + 1 (수의 범위를 오른쪽으로 옮긴다고 생각하면됨!)

mid > val : right = mid - 1 (수의 범위를 왼쪽으로 옮긴다고 생각하면됨!)

4. left가 right보다 더 커지면 탐색 끝! (또는 찾으면 탐색 끝!)


구현예시코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <algorithm>
using namespace std;
 
int a[10], val;
 
void BS(int x) {
    int left, right, mid;
    left = 0;
    right = 9;
    while (left <= right) {
        mid = (left + right) / 2;
        if (a[mid] == x) {
            printf("있음!\n");
            return;
        }
        else if (a[mid] < x)
            left = mid + 1;
        else if (a[mid] > x)
            right = mid - 1;
    }
    printf("없음!ㅠㅠ\n");
    return;
}
 
int main(){
    for (int i = 0; i < 10; i++)
        scanf("%d"&a[i]);
    scanf("%d"&val);
 
    sort(a, a + 10);
    BS(val);
 
    return 0;
}
cs



구현예시코드-결과

  


[STL] binary_search()을 이용하는 방법

c++에서 굳이 위에처럼 구현하지 않아도

algorithm 라이브러리에 있는 binary_search() 를 이용하면 쉽게 이분탐색할 수 있다.

binary_search(배열의처음, 배열의끝, 찾으려는 값)

있으면 true return, 없으면 false return


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <algorithm>
using namespace std;
 
int main(){
    int a[10], val;
    for (int i = 0; i < 10; i++)
        scanf("%d"&a[i]);
    scanf("%d"&val);
 
    sort(a, a + 10);
 
    if(binary_search(a, a+10, val)) 
        printf("있음!\n");
    else
        printf("없음!ㅠㅠ\n");
 
    return 0;
}
cs