16강 / 20강

탐색 — 처음부터 하나씩 vs 반씩 접기

정렬해 두면 찾기가 얼마나 빨라지는가

탐색 — 처음부터 하나씩 vs 반씩 접기
사전에서 낱말을 찾을 때 첫 장부터 넘기지 않죠. 가운데를 펼칩니다.

국어사전에서 '자료구조'를 찾는다고 합시다. 1쪽부터 한 장씩 넘기나요? 아니죠. 가운데를 펼치고, 'ㅈ'보다 앞이면 뒤쪽 절반을 버립니다. 이게 이진 탐색(binary search)이고, 이렇게 하려면 사전이 정렬되어 있어야 합니다.

🐌 선형 탐색
처음부터 하나씩 비교
정렬 필요 없음
1000개면 최대 1000번
O(n)
⚡ 이진 탐색
가운데와 비교 후 절반 버리기
정렬 필수
1000개면 최대 10번
O(log n)
1000개 중 맨 끝 값 찾기. 비교 횟수를 직접 세어 봅니다.
Python 브라우저에서 실행

🎮 반씩 접히는 과정 보기

찾을 값을 정하고 한 걸음씩 눌러 보세요. 버려지는 절반이 회색으로 사라집니다. 아래 막대는 선형 탐색과 이진 탐색의 비교 횟수를 나란히 보여 줍니다.

선형 vs 이진 탐색 — 절반이 버려지는 과정과 비교 횟수
불러오는 중…
log 의 위력을 숫자로 실감해 봅니다.
Python 브라우저에서 실행
bisect — 직접 만들 필요 없이 이미 준비되어 있습니다.
Python 브라우저에서 실행

그런데 해시가 더 빠르지 않나요?

맞습니다. 13강의 해시 테이블은 비교조차 없이 즉시 찾습니다. 그럼 이진 탐색은 왜 배울까요?

  • 해시는 "정확히 이 값"만 찾습니다. "85점 이상인 학생들"은 못 찾아요.
  • 이진 탐색은 "가장 가까운 값", "이 값이 들어갈 자리"도 알려 줍니다.
  • 해시는 순서가 없지만, 정렬된 배열은 순서 그 자체가 정보입니다.

속도만이 기준이 아닙니다. 이 이야기를 20강에서 마무리합니다.

🤔 확인 문제
이진 탐색을 쓰기 위한 필수 조건은?
🤔 확인 문제
100만 개짜리 정렬된 리스트에서 이진 탐색의 최대 비교 횟수는 약?
🤔 확인 문제
정렬되지 않은 데이터에서 값을 딱 한 번 찾아야 합니다. 가장 합리적인 방법은?