OPEN HYPER STEP
← 목록으로 (math)
MATH · 29 / 45
math
CHAPTER 29 / 45
읽기 약 2
FUNCTION

검색의 수학: 선형 vs 이진


핵심 개념

선형 O(n) vs 이진 O(log n) + 보간 검색 + DB 인덱스가 빠른 이유.

본문

선형 검색 — O(n)

PYTHON📋 코드 (11줄)
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)

PYTHON📋 코드 (20줄)
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단계)

성능 비교

PYTHON📋 코드 (18줄)
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 표준 라이브러리

PYTHON📋 코드 (23줄)
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)

PYTHON📋 코드 (30줄)
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 인덱스가 빠른 이유

SQL📋 코드 (15줄)
-- 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는 인덱스 갱신 비용 발생
-- 읽기 위주 컬럼만 인덱싱

다양한 자료구조의 검색

PYTHON📋 코드 (21줄)
# 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