16강 / 20강
탐색 — 처음부터 하나씩 vs 반씩 접기
정렬해 두면 찾기가 얼마나 빨라지는가
국어사전에서 '자료구조'를 찾는다고 합시다. 1쪽부터 한 장씩 넘기나요? 아니죠. 가운데를 펼치고, 'ㅈ'보다 앞이면 뒤쪽 절반을 버립니다. 이게 이진 탐색(binary search)이고, 이렇게 하려면 사전이 정렬되어 있어야 합니다.
🐌 선형 탐색
처음부터 하나씩 비교정렬 필요 없음
1000개면 최대 1000번
O(n)
⚡ 이진 탐색
가운데와 비교 후 절반 버리기정렬 필수
1000개면 최대 10번
O(log n)
1000개 중 맨 끝 값 찾기. 비교 횟수를 직접 세어 봅니다.
Python
브라우저에서 실행
🎮 반씩 접히는 과정 보기
찾을 값을 정하고 한 걸음씩 눌러 보세요. 버려지는 절반이 회색으로 사라집니다. 아래 막대는 선형 탐색과 이진 탐색의 비교 횟수를 나란히 보여 줍니다.
log 의 위력을 숫자로 실감해 봅니다.
Python
브라우저에서 실행
bisect — 직접 만들 필요 없이 이미 준비되어 있습니다.
Python
브라우저에서 실행
그런데 해시가 더 빠르지 않나요?
맞습니다. 13강의 해시 테이블은 비교조차 없이 즉시 찾습니다. 그럼 이진 탐색은 왜 배울까요?
- 해시는 "정확히 이 값"만 찾습니다. "85점 이상인 학생들"은 못 찾아요.
- 이진 탐색은 "가장 가까운 값", "이 값이 들어갈 자리"도 알려 줍니다.
- 해시는 순서가 없지만, 정렬된 배열은 순서 그 자체가 정보입니다.
속도만이 기준이 아닙니다. 이 이야기를 20강에서 마무리합니다.
🤔 확인 문제
이진 탐색을 쓰기 위한 필수 조건은?
해설 정렬되어 있어야 "가운데보다 작으니 뒤쪽은 볼 필요 없다"는 판단이 성립합니다. 정렬되지 않은 데이터에 이진 탐색을 쓰면 있는 값도 못 찾습니다.
🤔 확인 문제
100만 개짜리 정렬된 리스트에서 이진 탐색의 최대 비교 횟수는 약?
해설 절반씩 줄이므로 2를 몇 번 곱해야 100만이 되는지 = 약 20번입니다 (2²⁰ ≈ 104만). 개수가 10억이 되어도 30번이면 끝나요.
🤔 확인 문제
정렬되지 않은 데이터에서 값을 딱 한 번 찾아야 합니다. 가장 합리적인 방법은?
해설 정렬 비용이 탐색 한 번보다 훨씬 큽니다. 딱 한 번이면 그냥 훑는 게 이득이에요. 반복해서 찾을 때만 준비 비용이 회수됩니다.