ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 탐색 알고리즘 (2): 이진 탐색 (Binary Search)
    알고리즘 2025. 2. 26. 16:00

    1. 이진 탐색이란?

    이진 탐색(Binary Search)은 정렬된 데이터에서 원하는 값을 효율적으로 찾는 탐색 알고리즘이다. 탐색 과정에서 중간 값을 기준으로 탐색 범위를 절반씩 줄여가며 목표 값을 찾는다.

    이진 탐색은 순차 탐색보다 훨씬 빠른 O(log n)의 시간 복잡도를 가지며, 데이터의 크기가 커질수록 성능 차이가 커진다.

    2. 이진 탐색의 동작 원리

    이진 탐색은 다음과 같은 과정으로 수행된다:

    1. 중앙값 선택: 배열의 중앙 요소를 선택한다.
    2. 값 비교: 중앙값과 목표 값을 비교한다.
    3. 범위 축소:
      • 목표 값이 중앙값보다 작으면 왼쪽 절반에서 탐색
      • 목표 값이 중앙값보다 크면 오른쪽 절반에서 탐색
    4. 재귀 또는 반복: 목표 값을 찾을 때까지 위 과정을 반복한다.

    2.1 이진 탐색 과정 예제

    목표 값: 22

    정렬된 배열: [10, 14, 19, 22, 27, 33, 35]

    1. 중간값: 22 (인덱스 3) → 목표 값과 일치 → 탐색 종료

    출력: 인덱스 3

    2.2 이진 탐색 예제 코드 (Java)

    public class BinarySearch {
        // 이진 탐색 메서드 (반복문 구현)
        public static int binarySearch(int[] arr, int target) {
            int left = 0;
            int right = arr.length - 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; // 목표 값 없음
        }
    
        public static void main(String[] args) {
            int[] data = {10, 14, 19, 22, 27, 33, 35};
            int target = 22;
    
            int result = binarySearch(data, target);
            if (result != -1) {
                System.out.println("찾는 값의 위치: " + result);
            } else {
                System.out.println("값을 찾을 수 없습니다.");
            }
        }
    }

    3. 이진 탐색의 성능 분석

    이진 탐색의 성능은 탐색 대상의 크기(n)에 따라 결정된다.

    3.1 시간 복잡도

    • 최선의 경우 (Best Case): O(1) → 중앙값에서 바로 찾을 때
    • 평균의 경우 (Average Case): O(log n)
    • 최악의 경우 (Worst Case): O(log n) → 목표 값이 없거나 가장자리일 때

    3.2 공간 복잡도

    • 반복문 구현: O(1) → 추가 메모리 사용 없음
    • 재귀 구현: O(log n) → 재귀 호출 스택 사용

    4. 이진 탐색의 장점과 단점

    4.1 장점

    • 빠른 탐색 속도: O(log n)의 시간 복잡도로 대규모 데이터에서 효율적
    • 구현이 간단하며 다양한 형태로 변형 가능
    • 메모리 사용량이 적음 (반복문 사용 시 O(1))

    4.2 단점

    • 정렬된 데이터에서만 사용 가능
    • 데이터의 삽입, 삭제가 빈번한 경우 성능 저하
    • 재귀 구현 시 스택 오버플로우 위험

    5. 이진 탐색의 활용 및 개선 방법

    5.1 활용 사례

    • 검색 엔진: 정렬된 인덱스 기반의 빠른 검색
    • 데이터베이스: 정렬된 데이터에서 레코드 검색
    • 컴퓨터 과학: 정렬된 리스트에서 중복 제거 및 데이터 위치 확인

    5.2 개선 방법

    • 삼진 탐색(Ternary Search): 검색 범위를 3등분해 탐색 속도 향상
    • 이진 삽입(Binary Insertion Search): 정렬과 삽입을 결합해 성능 최적화
    • 균형 트리(Balanced Tree): 삽입 및 삭제가 빈번한 경우 AVL, 레드-블랙 트리 활용

    6. 이진 탐색의 변형

    • Lower Bound: 목표 값 이상이 처음 나타나는 위치
    • Upper Bound: 목표 값 초과가 처음 나타나는 위치

    6.1 Lower Bound 구현 (Java)

    public static int lowerBound(int[] arr, int target) {
        int left = 0;
        int right = arr.length;
    
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (arr[mid] < target) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        return left;
    }

    7. 결론

    이진 탐색은 정렬된 데이터에서 매우 효율적인 탐색 알고리즘으로, 다양한 분야에서 활용된다. O(log n)의 시간 복잡도로 빠른 성능을 제공하지만, 데이터가 정렬되어 있어야만 사용할 수 있는 제약이 있다. 데이터 특성에 맞는 변형을 적용하면 더 다양한 문제를 해결할 수 있다.

Designed by Tistory.