Programming/Alogrithm

이진 검색

Anatis 2021. 6. 26. 21:27

이진 검색

이진 검색(Binary search)은 요소가 오름차순 또는 내림차순으로 정렬된 배열에서 검색하는 알고리즘이다.

 

오름차순으로 정렬된 데이터에서 66을 검색하는 과정이다. 66은 중앙 요소 40보다 큰 값이다. 그러므로 대상을 뒤쪽의 요소들로 좁힐 수 있다.

 

예제 코드

/* 이진 검색 */
#include <stdio.h>
#include <stdlib.h>

int bin_search(const int a[], int n, int key)
{
    int pl = 0;
    int pr = n - 1;
    int pc;

    do {
        pc = (pl + pr) / 2;
        if(a[pc] == key)    /* 검색 성공 */
            return pc;
        else if(a[pc] < key)
            pl = pc + 1;
        else
            pr = pc - 1;
    } while(pl <= pr);
    return -1;  /* 검색 실패 */
}

int main(void)
{
    int i, nx, ky, idx;
    int *x;

    puts("이진 검색");
    printf("요소 개수 : ");
    scanf("%d", &nx);

    x = calloc(nx, sizeof(int));
    printf("오름차순으로 입력하세요.\n");
    printf("x[0] : ");
    scanf("%d", &x[0]);
    for(i = 1; i < nx; i++) {
        do {
            printf("x[%d] : ", i);
            scanf("%d", &x[i]);
        } while(x[i] < x[i - 1]);   /* 바로 앞의 값보다 작으면 다시 입력 */
    }

    printf("검색값 : ");
    scanf("%d", &ky);
    idx = bin_search(x, nx, ky);
    if(idx == -1)
        puts("검색에 실패했습니다.");
    else
        printf("%d는(은) x[%d]에 있습니다.\n", ky, idx);
    free(x);

    return 0;
}

 

복잡도

1. 시간 복잡도(time complexity) : 실행에 필요한 시간을 평가한 것

2. 공간 복잡도(space complexity) : 기억 영역과 파일 공간이 얼마나 필요한가를 평가한 것

 

선형 검색의 시간 복잡도

int search(const int a[], int n, int key)
{
    int i = 0;	# 1
    while(i < n) {	# 2
        if(a[i] == key)	# 3
            return i;	# 4
        i++;	# 5
    }
    return -1;	# 6
}

위 코드는 1 ~ 6의 각 단계가 몇 회 실행되는지에 대한 내용 정리이다.

 

- 1 : i에 0을 대입 후 처음 한 번 실행한 이후에는 없다. (이렇게 한 번만 실행하는 경우 복잡도는 O(1)로 표기한다)

- 2 : 배열의 끝에 도달했는지를 판단하는 2와 현재 검사하고 있는 요소와 찾고자 하는 값이 같은지를 판단하는 3의 평균 실행 횟수는 n/2이다. 이처럼 n에 비례하는 횟수만큼 실행하는 경우의 복잡도를 O(n)이다.

- 4, 6 : 이 부분도 한번만 실행하기 때문에 O(1)로 표기한다.

 

 

이진 검색의 시간 복잡도

int bin_search(const int a[], int n, int key)
{
    int pl = 0;		# 1
    int pr = n - 1;	# 2

    do {
        int pc = (pl + pr) / 2;	# 3
        if(a[pc] == key)    /* 검색 성공 */	# 4
            return pc;	# 5
        else if(a[pc] < key)	# 6
            pl = pc + 1;	# 7
        else	# 8
            pr = pc - 1;	# 9
    } while(pl <= pr);	# 10
    return -1;  /* 검색 실패 */# 11
}

- 1 : 실행 횟수 1 복잡도 O(1)

- 2 : 실행 횟수 1 복잡도 O(1)

- 3 : 실행 횟수 log n 복잡도 O(log n)

- 4: 실행 횟수 log n 복잡도 O(log n)

- 5 : 실행 횟수 1 복잡도 O(1)

- 6 : 실행 횟수 log n 복잡도 O(log n)

- 7 : 실행 횟수 log n 복잡도 O(log n)

- 8 : 실행 횟수 1 복잡도 O(1)

- 9 : 실행 횟수 log n 복잡도 O(log n)

- 10 : 실행 횟수 log n 복잡도 O(log n)

- 11 : 실행 횟수 1 복잡도 O(1)