출시·고도화 중
Algorithm
빅오 표기법으로 알고리즘의 실행 시간과 메모리가 입력 크기에 따라 어떻게 늘어나는지 분석하고, 직접 측정해 확인하는 방법을 배웁니다.
복잡도 분석은 입력이 커질 때 알고리즘에 필요한 시간과 메모리가 얼마나 늘어나는지를 설명하는 방법입니다. 하드웨어와 언어에 따라 달라지는 초 단위 시간 대신 기본 연산 횟수를 입력 크기 n의 함수로 세고, 가장 큰 항만 남깁니다. 결과는 상한을 뜻하는 Big-O, 하한을 뜻하는 Big-Omega, 딱 맞는 차수를 뜻하는 Big-Theta 같은 점근 표기로 씁니다.
데이터가 커지면 차수의 차이가 어떤 상수 차이보다도 커지기 때문에 복잡도 분석이 중요합니다. 원소 천 개에서는 문제없던 O(n²) 코드가 백만 개에서는 몇 시간이 걸릴 수 있지만, O(n log n) 코드는 몇 초 안에 끝납니다. 자료 구조를 고르고, 코딩 테스트의 입력 범위를 해석하고, 코드 리뷰에서 숨은 비용을 찾고, 시스템이 확장될 수 있을지 가늠할 때 모두 복잡도를 씁니다.
먼저 간단한 반복문의 연산 횟수를 세어 보고 O(1), O(log n), O(n), O(n log n), O(n²), O(2ⁿ), O(n!) 같은 대표 차수를 익힙니다. 그다음 최선·평균·최악의 경우, 상환 분석, 공간 복잡도, 마스터 정리를 이용한 점화식 풀이로 넘어갑니다. 공부하는 내내 n과 2n에서 시간을 재어 비율을 비교하는 두 배 실험으로 분석이 맞는지 확인하는 습관을 들이면 좋습니다.
O, Ω, Θ는 상수와 낮은 차수 항을 무시하고 성장 속도의 상한, 하한, 딱 맞는 차수를 나타냅니다.
차례로 이어진 코드는 비용을 더하고, 중첩 반복은 곱하며, 매번 문제를 절반으로 줄이면 로그가 됩니다.
여러 연산의 총비용을 연산 수로 나누어 보장합니다. 동적 배열의 append가 가끔 전체를 복사해도 O(1)인 이유입니다.
보조 메모리와 재귀 깊이도 비용에 들어가며, 분할 정복의 점화식은 마스터 정리로 풉니다.
같은 문제를 모든 쌍을 확인하는 방법과, 본 값을 딕셔너리에 기억하며 한 번 훑는 방법으로 풉니다. n = 500, 1,000, 2,000에서 timeit으로 두 함수를 재면 n이 두 배가 될 때마다 이차 버전은 약 네 배, 선형 버전은 약 두 배 느려집니다.
complexity.py
import timeit
def two_sum_quadratic(nums, target):
"""O(n^2): try every pair."""
for i in range(len(nums)):
for j in range(i + 1, len(nums)):
if nums[i] + nums[j] == target:
return i, j
return None
def two_sum_linear(nums, target):
"""O(n) on average: remember values already seen."""
seen = {}
for j, x in enumerate(nums):
i = seen.get(target - x)
if i is not None:
return i, j
seen.setdefault(x, j)
return None
print(two_sum_quadratic([8, 3, 11, 5, 2], 13), two_sum_linear([8, 3, 11, 5, 2], 13))
for n in (500, 1_000, 2_000):
nums = list(range(0, 2 * n, 2)) # even numbers only, so no pair sums to -1
slow = timeit.timeit(lambda: two_sum_quadratic(nums, -1), number=3) / 3
fast = timeit.timeit(lambda: two_sum_linear(nums, -1), number=3) / 3
print(f"n={n:>5} O(n^2) {slow * 1000:8.2f} ms O(n) {fast * 1000:6.3f} ms")
python complexity.py설치부터 복잡도 분석 의 핵심 개념까지, 여섯 장으로 차근차근 따라 합니다.
복잡도 분석 에 관해 묻고, 경험을 나누고, 의견을 주고받는 곳입니다.
아직 토론이 없습니다. 첫 이야기를 시작해 보세요.
댓글 0개
로그인 · 로그인하면 댓글을 남길 수 있습니다.
첫 댓글을 남겨 보세요.