9. 이진 탐색 (Binary Seach)
9. 이진 탐색 (Binary Seach)
1. 이진 탐색이란?
- 정렬된 리스트에서 특정 값을 빠르게 찾는 방법
- 전체를 처음부터 끝까지 뒤지지 않고, 중간을 기준으로 반씩 줄여나가는 방식
💡 동작 방식: “반 갈라서 쳐내기”
예: 정렬된 리스트가 있다고 가정해보자
1
[1, 3, 5, 7, 9, 11, 13]
9
를 찾고 싶다면
- 중간값 → 7 → 작으니 오른쪽 절반만 보기
- 그다음 중간 → 11 → 크니 왼쪽 절반만 보기
- 찾음!
총 3번 비교만으로 찾음
시간복잡도 O(log N) (매 단계마다 절반씩 날려버림)
2. 이진 탐색 기본 구조
반복문
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def binary_search(arr, target):
left, right = 0, len(arr)-1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid # 위치 반환
elif arr[mid] < target:
left = mid + 1 # 오른쪽 탐색
else:
right = mid - 1 # 왼쪽 탐색
return -1 # 못찾은 경우
arr = [1, 3, 5, 7, 9, 11, 13]
print(binary_search(arr, 11))
''' 출력
5
'''
재귀
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def binary_search_recursive(arr, target, left, right):
if left > right:
return -1
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
return binary_search_recursive(arr, target, mid + 1, right)
else:
return binary_search_recursive(arr, target, left, mid - 1)
3. 라이브러리
파이썬에선 bisect
라이브러리로 간단하게 구현 가능
1
2
3
4
5
6
7
8
9
10
import bisect
arr = [1, 3, 5, 7, 9]
idx = bisect.bisect_left(arr, 5) # 5 위치
print(idx)
''' 출력
2
'''
4. 이진 탐색은 어디에 쓰나?
분야 | 설명 |
---|---|
값 찾기 | 특정 숫자가 리스트에 존재하는지 |
위치 찾기 | 특정 조건을 만족하는 값의 최소/최대 인덱스 |
개수 세기 | 정렬된 리스트에서 특정 값의 등장 횟수 |
최적화 문제 | 이진탐색 범위를 “값 자체”로 잡는 경우 (parametric search ) |
This post is licensed under CC BY 4.0 by the author.