🏠 전체 위키 수학 위키 지도 목록 사전
더보기

이진 탐색

CS·데이터사이언스 고등 · v1 · 🤖 LLM 버전

🧭 선수 개념 — 이 문서는 다음을 안다는 전제로 쓰였어요: 수열 · 부등식 (중등)

정의

이진 탐색(binary search, 이분 탐색이라고도 한다)은 오름차순으로 정렬된 자료에서 특정한 값을 찾을 때, 탐색 범위를 매번 절반으로 줄여가며 원하는 값을 찾아내는 알고리즘이다.

배열 $a_1, a_2, \ldots, a_n$이 오름차순으로 정렬되어 있고 찾으려는 값이 $x$일 때, 알고리즘은 다음과 같이 진행된다.

  1. 탐색 범위의 양 끝 인덱스를 $low = 1$, $high = n$으로 둔다.
  2. 중앙 인덱스 $mid = \left\lfloor \dfrac{low+high}{2} \right\rfloor$($\lfloor \; \rfloor$는 바닥함수라 읽으며, 어떤 실수보다 크지 않은 최대의 정수를 뜻한다)를 계산한다.
  3. $a_{mid}$와 $x$를 비교한다.
  4. $low > high$가 될 때까지 2~3을 반복한다. 이 경우 $x$는 배열에 존재하지 않는다.

직관

전화번호부나 사전에서 단어를 찾을 때 처음부터 한 장씩 넘기지 않고, 책의 가운데를 펼쳐 찾는 단어와 비교한 뒤 앞쪽인지 뒤쪽인지 판단해서 그 반쪽만 다시 살펴보는 방식과 같다. 한 번 비교할 때마다 살펴봐야 할 범위가 절반으로 줄어들기 때문에, 자료의 개수가 아무리 많아도 비교 횟수는 훨씬 느리게 늘어난다.

시간복잡도

크기가 $n$인 배열은 한 번 비교할 때마다 범위가 절반으로 줄어들므로, $n$을 계속 2로 나누어 1이 될 때까지 필요한 횟수, 즉 $\log_2 n$번 정도 비교하면 탐색이 끝난다. 따라서 이진 탐색의 시간복잡도는 $O(\log n)$(빅오 로그 엔이라 읽는다)이다. 이는 처음부터 순서대로 하나씩 비교하는 순차 탐색의 시간복잡도 $O(n)$보다 훨씬 빠르다. 예를 들어 원소가 100만 개여도 이진 탐색은 최대 약 20번의 비교로 탐색이 끝난다($2^{20} \approx 1048576$이기 때문).

예시

정렬된 수열 $2, 5, 8, 12, 16, 23, 38, 45, 56, 72, 91$ (인덱스 1~11)에서 $x=45$를 찾아보자.

비교 횟수가 배열 크기에 따라 얼마나 느리게 늘어나는지는 $\log_2 x$ 그래프로 확인할 수 있다.

🌍 실생활 예시

프로그래밍에서 버그가 처음 발생한 커밋을 찾을 때 쓰는 git bisect 명령어가 이진 탐색의 대표적인 활용이다. 수백 개의 커밋 이력 중 가운데 커밋을 확인해 버그가 있는지 없는지 판단하고, 그 결과에 따라 앞쪽 절반 또는 뒤쪽 절반만 다시 살펴보는 과정을 반복해서 원인이 되는 커밋을 빠르게 찾아낸다.

⚠️ 흔한 실수

확인 문제

  1. 정렬된 수열 $3, 7, 10, 15, 22, 30, 41, 55$ (인덱스 1~8)에서 이진 탐색으로 $22$를 찾는 과정을 $low, high, mid$ 값과 함께 순서대로 적어보시오.
  2. 크기가 1024인 정렬된 배열에서 이진 탐색으로 원하는 값을 찾으려면 최악의 경우 몇 번 비교해야 하는지 구하고, 왜 그런 횟수가 나오는지 설명하시오.
  3. 정렬되지 않은 배열 $[7, 2, 9, 4, 1]$에서 $4$를 찾기 위해 이진 탐색의 절차(중앙값과 비교해서 절반을 버리는 방식)를 그대로 적용하면 어떤 문제가 생기는지 설명하시오.
정답 보기
  1. $low=1, high=8$, $mid=4$, $a_4=15<22$ → $low=5$. $low=5, high=8$, $mid=6$, $a_6=30>22$ → $high=5$. $low=5, high=5$, $mid=5$, $a_5=22=x$ → 성공 (3번 비교).
  2. 최대 10번 비교한다. $1024 = 2^{10}$이므로, 범위를 절반으로 줄이는 과정을 10번 반복하면 남은 원소가 1개가 되기 때문이다($1024 \to 512 \to 256 \to \cdots \to 1$).
  3. 배열이 정렬되어 있지 않으므로 중앙값 $9$와 $4$를 비교해 $4$가 더 작다고 왼쪽 절반 $[7, 2]$만 남기고 오른쪽 $[4, 1]$을 버리면, 실제로 $4$가 들어 있는 부분을 버리게 되어 값을 찾지 못한다.

관련 개념

연결 문서 그래프 (5)

굵은 테두리가 현재 문서, → 화살표는 선수 관계(선수 → 후속)예요. 노드를 누르면 해당 문서로 이동합니다. 전체 그래프 보기