math
CHAPTER 29 / 45
읽기 약 2분
FUNCTION
검색의 수학: 선형 vs 이진
핵심 개념
선형 O(n) vs 이진 O(log n) + 보간 검색 + DB 인덱스가 빠른 이유.
본문
선형 검색 — O(n)
def linear_search(arr, target):
for i, x in enumerate(arr):
if x == target:
return i
return -1
arr = [3, 1, 4, 1, 5, 9, 2, 6, 5]
print(linear_search(arr, 5)) # 4
# 정렬 불필요 — 어떤 배열에도 동작
# 100만 개 → 평균 50만 비교이진 검색 — O(log n)
def binary_search(arr, target):
"""전제: arr가 정렬됨"""
lo, hi = 0, len(arr) - 1
while lo <= hi:
mid = (lo + hi) // 2
if arr[mid] == target:
return mid
if arr[mid] < target:
lo = mid + 1
else:
hi = mid - 1
return -1
sorted_arr = sorted([3, 1, 4, 1, 5, 9, 2, 6, 5])
print(binary_search(sorted_arr, 5)) # 5나 6 위치
# 100만 개 → log₂(1,000,000) ≈ 20번 비교
# 100만 → 50만 → 25만 → 12.5만 → ... → 1 (20단계)성능 비교
import time
n = 10_000_000
arr = list(range(n))
target = n - 1
t0 = time.perf_counter()
linear_search(arr, target)
t_linear = time.perf_counter() - t0
t0 = time.perf_counter()
binary_search(arr, target)
t_binary = time.perf_counter() - t0
print(f"선형 ({n:,}개): {t_linear*1000:.1f}ms")
print(f"이진 ({n:,}개): {t_binary*1000:.4f}ms")
print(f"속도 차이: {t_linear / t_binary:.0f}배")
# 약 100,000배 이상 빠름bisect — Python 표준 라이브러리
import bisect
arr = [1, 3, 4, 4, 6, 7, 9]
# 위치 찾기 (값이 들어갈 곳)
print(bisect.bisect_left(arr, 4)) # 2 (왼쪽)
print(bisect.bisect_right(arr, 4)) # 4 (오른쪽)
# 정렬 유지하며 삽입
bisect.insort(arr, 5)
print(arr) # [1, 3, 4, 4, 5, 6, 7, 9]
# 직접 검색
def binary_search_bisect(arr, target):
i = bisect.bisect_left(arr, target)
if i < len(arr) and arr[i] == target:
return i
return -1
print(binary_search_bisect(arr, 5)) # 4보간 검색 — 균등 분포에서 O(log log n)
def interpolation_search(arr, target):
"""균등 분포 데이터에서 이진 검색보다 빠름"""
lo, hi = 0, len(arr) - 1
while lo <= hi and arr[lo] <= target <= arr[hi]:
if arr[hi] == arr[lo]:
if arr[lo] == target: return lo
return -1
# 비례식으로 위치 추정
pos = lo + ((target - arr[lo]) * (hi - lo)) // (arr[hi] - arr[lo])
if arr[pos] == target:
return pos
if arr[pos] < target:
lo = pos + 1
else:
hi = pos - 1
return -1
# 균등 분포 — 빠름
arr_uniform = list(range(0, 1_000_000, 10))
print(interpolation_search(arr_uniform, 500_000)) # 50000
# 비균등 분포 — 이진 검색보다 느릴 수 있음
arr_skewed = [1] * 999 + list(range(1, 1001))
# interpolation_search는 약함 → binary_search 추천DB 인덱스가 빠른 이유
-- B-Tree 인덱스 = 다진 균형 트리
-- 100만 행 → 약 3~4단계 (각 노드가 100~1000 키)
-- 인덱스 없음
SELECT * FROM users WHERE email = 'alice@example.com';
-- O(n) 풀 스캔 — 100만 행 모두 비교
-- 인덱스 있음
CREATE INDEX idx_email ON users(email);
SELECT * FROM users WHERE email = 'alice@example.com';
-- O(log n) — 약 20번 비교
-- 단, INSERT/UPDATE는 인덱스 갱신 비용 발생
-- 읽기 위주 컬럼만 인덱싱다양한 자료구조의 검색
# 1. List — O(n)
nums = list(range(1_000_000))
999_999 in nums # ~10ms
# 2. Set — O(1) 평균 (해시)
nums_set = set(nums)
999_999 in nums_set # ~0.001ms
# 3. Dict — O(1) 평균 (해시)
nums_dict = {n: n for n in nums}
999_999 in nums_dict # ~0.001ms
# 4. Sorted List + bisect — O(log n)
import bisect
i = bisect.bisect_left(nums, 999_999)
exists = i < len(nums) and nums[i] == 999_999 # ~0.0005ms
# 5. Tree (sortedcontainers) — O(log n)
from sortedcontainers import SortedList
sl = SortedList(nums)
999_999 in sl # ~0.001ms다음 챕터
CH.30 "점화식" — 재귀의 수학적 분석.
AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude
무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6
내 데이터 검색 코드를 분석해서 선형/이진/해시 중 적합한 방식과 예상 성능 향상을 보고해줘.
ChatGPT
무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro
한국 검색 엔진(Naver/Daum)의 인덱싱 알고리즘 사례를 비교 분석해줘.
Gemini
무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro
내 DB의 모든 SELECT WHERE 쿼리를 분석해서 인덱스 추가 우선순위와 ROI를 만들어줘.
Grok
무료: Grok 4.1 / SuperGrok $30/mo
2026년 검색 엔진(Elasticsearch/Algolia)과 전통 RDBMS 인덱스 차이를 솔직히 알려줘.
⭐ 이것만 기억하세요
검색의 수학: 선형 vs 이진은 이 3가지만 확실히 잡으세요
1.이진 검색은 O(log n) — 100만 개 데이터에서 20번 비교로 끝
2.이진 검색의 전제는 "정렬됨" — 정렬 비용 O(n log n)도 고려
3.다음 챕터 CH.30에서 점화식 — 재귀 알고리즘의 시간복잡도 분석법
공유하기
진행도 29 / 45