• 이분 탐색(Binary Search)

이분 탐색은 정렬된 배열에서 값을 찾는 효율적인 알고리즘이다.

 

어릴 적 친구와 1부터 100까지의 수 중 숫자 맞추기를 할 때 똑똑한 친구들은 50보다 커?(ㅇㅇ) 75보다 커?(ㄴㄴ) 이런 식으로 반 씩 줄여서 질문을 했을 것이다. 이것이 이분 탐색이다.

 

이 알고리즘은 배열을 차례대로 탐색하는 것이 아니라, 중간 값을 기준으로 탐색 범위를 계속해서 반으로 줄여나간다.

 

이로 인해 시간복잡도가 O(log n)으로 효율적이다.

 

아래 표에서 2를 찾아보겠다.

1 2 3 4 5 6 7 8 9

 

먼저 중간 값인 5를 탐색한다. 2는 5보다 작기에 5보다 큰 값들은 신경 쓰지 않는다.

1 2 3 4 5        

 

남은 값들 중 중간 값인 3을 탐색한다. 2는 3보다 작기에 3보다 큰 값들은 신경 쓰지 않는다.

1 2 3            

 

남은 값들 중 중간 값인 2를 탐색한다. 우리가 찾던 값임으로 알고리즘은 종료된다.

  2              

 

 


  • C언어로 구현한 이진탐색
#include <stdio.h>

int binarySearch(int arr[], int size, int target) {
    int left = 0;
    int right = size - 1;

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

        // 목표 값을 찾았을 때
        if (arr[mid] == target) {
            return mid;
        }

        // 목표 값이 중간 값보다 클 경우 오른쪽 부분 탐색
        if (arr[mid] < target) {
            left = mid + 1;
        }
        // 목표 값이 중간 값보다 작을 경우 왼쪽 부분 탐색
        else {
            right = mid - 1;
        }
    }

    // 값을 찾지 못했을 때
    return -1;
}

int main() {
    int arr[] = {2, 3, 4, 10, 40};
    int size = sizeof(arr) / sizeof(arr[0]);
    int target = 10;
    int result = binarySearch(arr, size, target);

    if (result != -1) {
        printf("Element is present at index %d\n", result);
    } else {
        printf("Element is not present in array\n");
    }

    return 0;
}

 

'알고리즘 & 자료구조' 카테고리의 다른 글

동적 계획법(Dynamic Programming, DP)  (0) 2024.08.26
d0ng2