5강 / 20강
이진 탐색 — 100만 개를 20번에
정렬해 두면 절반씩 버릴 수 있다
국어사전에서 '알고리즘'을 찾을 때, 여러분은 1페이지부터 넘기지 않습니다. 대충 가운데를 펴고 "아, 여기는 'ㅅ'이네, 그럼 앞쪽" 하며 절반을 버리죠.
이것이 이진 탐색(binary search)입니다. 한 번 볼 때마다 후보의 절반이 사라집니다.
🎮 이진 탐색 실험실
정렬된 주문번호 목록에서 하나를 찾아 봅시다. ▶ 한 걸음을 누를 때마다 회색으로 버려지는 절반을 보세요. 아래쪽에는 선형 탐색과 비교 횟수가 나란히 표시됩니다.
10만 건을 17걸음에. 직접 실행해 확인해 보세요.
Python
브라우저에서 실행
왜 O(log n)일까요
매번 절반이 사라지니까, 몇 번 반으로 나누면 1이 되는가가 걸음 수입니다.
| 데이터 개수 n | 선형 탐색 (최악) | 이진 탐색 (최악) |
|---|---|---|
| 100 | 100번 | 7번 |
| 1,000 | 1,000번 | 10번 |
| 100,000 | 100,000번 | 17번 |
| 1,000,000 | 1,000,000번 | 20번 |
| 1,000,000,000 | 10억 번 | 30번 |
맨 아래를 보세요. 데이터가 1,000배 늘어도 걸음은 10번만 늘어납니다.
이것이 O(log n)의 힘이에요. 데이터가 커질수록 이 차이는 더 벌어집니다.
log2(n)이 곧 걸음 수입니다.
Python
브라우저에서 실행
이진 탐색이 안 되는 경우
- 정렬이 안 됨 — 이진 탐색의 전제가 깨집니다. 답이 틀리게 나와요.
- 부분 일치 검색 — "이어폰이 들어간 상품"은 정렬로 못 찾습니다. (이건 전문 검색 엔진의 영역이에요.)
- 데이터가 계속 바뀜 — 정렬 상태를 유지하는 데 비용이 듭니다. 삽입이 아주 잦으면 해시가 낫습니다 (8강).
정렬은 이진 탐색의 '선택'이 아니라 '전제'입니다.
Python
브라우저에서 실행
🤔 확인 문제
정렬된 상품 100만 개에서 이진 탐색으로 하나를 찾을 때 최악 비교 횟수는?
해설 log₂(1,000,000) ≈ 20 입니다. 100만 개를 20번에 — 이것이 인덱스를 거는 이유예요.
🤔 확인 문제
이진 탐색을 쓰기 위한 필수 전제 조건은?
해설 정렬이 전부입니다. 정렬이 깨져 있으면 이진 탐색은 틀린 답(없다고)을 내놓습니다 — 오류도 안 나서 더 위험해요.
🤔 확인 문제
"주문 조회가 느립니다"라는 신고를 받았을 때 시스템 관리자가 가장 먼저 확인할 것은?
해설 인덱스가 없으면 DB는 전체를 훑습니다(O(n)). 인덱스를 걸면 O(log n)이 되죠. 서버를 2배로 키워 봐야 O(n)은 여전히 O(n)입니다.