이분 탐색 알고리즘(Binary Search Algorithm)

이분 탐색

이분 탐색이란 정렬되어 있는 배열(중요*)에서 특정 데이터를 찾기 위해 모든 데이터를 순차적으로 확인하지 않고 탐색 범위를 절반으로 줄여가며 찾는 탐색 방법이다. 만약 순차적으로 확인한다면 이건 선형 탐색이라고 하는 탐색법이 된다. 선형 탐색은 $O(n)$, 이분 탐색은 $O(logn)$으로 배열의 크기가 커질수록 이분 탐색의 선형 탐색 대비 효율성이 더욱 더 증가한다.

예제풀며 배워보기

간단한 수로 이분 탐색을 배워보자.

| 4 | 1 | 5 | 2 | 3 | |—|—|—|—|—|

위와 같은 배열이 있다. 위 배열을 정렬시킨다.

1 2 3 4 5 2
st   md   en target

정렬시킨 처음, 중간, 끝을 각각의 변수(st, md, en)에 저장한다. 찾는 수 2는 target 변수에 저장한다.

그리고 md와 target을 계속 비교하며 절반으로 줄여나가면 된다. md(3)보다 target(2)가 작으므로 정렬된 배열에서 찾는 수가 있는 곳은 왼쪽의 배열, 즉

1 2 3 4 5
   

이 곳에 있게 된다. 새롭게 st, md, en 을 정해준다.

1 2 3 4 5
st md en    

다시 비교해보면 md == target으로 같은 수가 나온다. 반복문을 나오며 종료한다.

만약에 target이 배열 안에 없다면, st, md, en이 전부 같은 곳에 있게 된다.

1 2 3 4 5
  st
md
en
     

그러므로 배열이 없을 때 $st>=en$일 때도 반복문을 나오며 종료한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
arr = [4, 1, 5, 2, 3] # 입력된 배열
arr.sort() # 파이썬의 정렬 함수 sort()는 시간복잡도가 O(nlogn)이다.
target = 2 # 예제 타겟 설정

# 초기 st, en, md 지점 설정
st = 0 # 배열의 처음
en = len(arr) - 1 # 배열의 끝
md = int((st + en) / 2) # 배열의 중간

while True: # 다른 조건이 없으면 st<=en 으로 하면 됨
    if arr[md] == target:
        print(1)
        break
    elif arr[md] > target:
        en = md - 1
        md = int((st + en) / 2)
    elif arr[md] < target:
        st = md + 1
        md = int((st + en) / 2)

    if st >= en: # 종료 조건
        print(0)
        break

댓글남기기