[Algorithm] – “이진 탐색(Binary Search)”

[Algorithm] – “이진 탐색(Binary Search)”

5월 25, 2024

이진 탐색(Binary Search) 의 개념

이진 탐색은 분할정복 방법을 이용해 배열 형태로 주어진 데이터에서 원하는 값을 가진 데이터를 찾는 것입니다. 이진 탐색은 탐색의 대상이 되는 데이터가 정렬된 상태라면 효과적으로 탐색을 수행할 수 있습니다. 이진 탐색은 탐색 키를 아래의 과정을 통해서 찾습니다.

  • 분할: 배열을 가운데 원소를 기준으로 왼쪽 부분배열과 오른쪽 부분배열로 분할합니다. 탐색키가 가운데 원소와 같다면 가운데 원소에 대항다는 배열의 인덱스를 반환하고 종료합니다.
  • 정복: 탐색키가 가운데 원소보다 작으면 왼쪽 부분배열을 대상으로, 크면 오른쪽 부분배열을 대상으로 이진 탐색을 순환 호출합니다.
  • 결합: 부분배열에 대해서 이진 탐색의 결과가 직접 반환되므로 결과를 결합할 필요는 없습니다.

이진 탐색의 Python 구현

Python 으로 이진 탐색을 아래와 같이 구현할 수 있습니다.

def binary_search(arr: list, x: int) -> int:
    l, r = 0, len(arr) - 1

    while l <= r:
        mid = l + (r - l) // 2
        if arr[mid] == x:
            return mid
        elif arr[mid] < x:
            l = mid + 1
        else:
            r = mid - 1

    return -1

위에서 설명한 순서를 그대로 작성하면 됩니다. 가운데부터 시작하여 가운데 원소가 찾는 값과 같으면 그 값의 인덱스를 반환하고, 그렇지 않으면 값의 대소에 따라 오른쪽과 왼쪽을 탐색합니다.

이진 탐색의 성능 분석과 특징

  • 이진 탐색의 시간 복잡도를 T(n), 입력 크기를 n 이라고 한다면, T(n) 은 탐색 과정에서 수행되는 모든 비교 횟수의 합으로 표현할 수 있습니다. T(n)=T(n/2)+1, T(1)=1 과 같은 점화식에 의해 계산될 수 있는데, 이진 탐색의 시간 복잡도는 O(logn) 입니다.
  • 이진 탐색은 입력이 정렬된 리스트일 때에만 적용이 가능합니다.
  • 데이터의 삽입, 삭제 연산을 수행하면 데이터의 이동이 발생합니다.
  • 고로, 이진 탐색은 데이터의 삽입과 삭제가 빈번한 응용에서의 탐색으로는 적합하지 않습니다.

Leave A Comment

Avada Programmer

Hello! We are a group of skilled developers and programmers.

Hello! We are a group of skilled developers and programmers.

We have experience in working with different platforms, systems, and devices to create products that are compatible and accessible.