math
CHAPTER 7 / 15
읽기 약 2분
FUNCTION
지수와 로그: 빅데이터와 복잡도의 언어
핵심 개념
지수 2^n과 로그 log₂n — 알고리즘 시간복잡도, 이진 탐색이 빠른 이유, 빅데이터 처리의 수학.
본문
지수 (Exponent) — 빠르게 커지는 수
2^0 = 1
2^1 = 2
2^2 = 4
2^3 = 8
2^10 = 1,024 ≈ 1K
2^20 = 1,048,576 ≈ 1M
2^30 ≈ 1B
2^32 ≈ 4.3B (32-bit 정수 한계)
2^64 ≈ 1.8 × 10^19 (64-bit 정수)로그 (Logarithm) — 지수의 역
log₂(8) = 3 ← 2^3 = 8 이므로
log₂(1024) = 10
log₂(1000000) ≈ 20
log₁₀(1000) = 3
ln(e) = 1 ← 자연로그 (e ≈ 2.718)코드로 증명
import math
# 2^n
print(2 ** 10) # 1024
print(pow(2, 20)) # 1048576
# log₂(n)
print(math.log2(1024)) # 10.0
print(math.log2(1000000)) # 약 19.93
# 자연로그
print(math.log(math.e)) # 1.0
# 지수 함수 시각화
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
plt.plot(x, 2**x, label='2^x (지수 폭발)')
plt.plot(x, x**2, label='x² (다항식)')
plt.plot(x, x, label='x (선형)')
plt.plot(x[1:], np.log2(x[1:]), label='log₂(x) (로그)')
plt.legend()
plt.title('함수 성장 속도 비교')
plt.grid(True)
plt.show()
# → 지수는 빠르게 폭발, 로그는 거의 평평알고리즘 시간복잡도 — Big-O와 로그
# O(n) — 선형 탐색: 1000개 데이터 → 1000번 비교
# O(log n) — 이진 탐색: 1000개 데이터 → 약 10번 비교
import time
def linear_search(arr, target):
"""O(n) — 처음부터 끝까지"""
for i, v in enumerate(arr):
if v == target:
return i
return -1
def binary_search(arr, target):
"""O(log n) — 정렬된 배열에서 절반씩 줄이기"""
lo, hi = 0, len(arr) - 1
while lo <= hi:
mid = (lo + hi) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
lo = mid + 1
else:
hi = mid - 1
return -1
# 100만 개에서 999,999 찾기
arr = list(range(1_000_000))
t0 = time.perf_counter()
linear_search(arr, 999_999)
t_linear = time.perf_counter() - t0
t0 = time.perf_counter()
binary_search(arr, 999_999)
t_binary = time.perf_counter() - t0
print(f"선형 탐색: {t_linear*1000:.2f}ms") # ~30ms
print(f"이진 탐색: {t_binary*1000:.2f}ms") # ~0.005ms
print(f"속도 차이: {t_linear / t_binary:.0f}배") # ~6000배
# log₂(1,000,000) ≈ 20
# 선형은 1,000,000 비교 vs 이진은 20 비교 → 50,000배 빠름데이터 크기별 시간복잡도 표
def complexity_table(n_values=[10, 100, 1000, 10000, 100000, 1000000]):
print(f"{'N':>10} {'O(1)':>8} {'O(log n)':>10} {'O(n)':>10} {'O(n log n)':>14} {'O(n²)':>14}")
for n in n_values:
log_n = math.log2(n)
print(f"{n:>10,} {1:>8} {log_n:>10.1f} {n:>10,} {n*log_n:>14,.0f} {n*n:>14,}")
complexity_table()
# 결과:
# N O(1) O(log n) O(n) O(n log n) O(n²)
# 10 1 3.3 10 33 100
# 100 1 6.6 100 664 10,000
# 1,000 1 10.0 1,000 9,966 1,000,000
# 10,000 1 13.3 10,000 132,877 100,000,000
# 100,000 1 16.6 100,000 1,660,964 10,000,000,000
# 1,000,000 1 19.9 1,000,000 19,931,569 1,000,000,000,000실전 — 빅데이터 처리 시간 추정
# 1초에 1억 번 연산 가능한 컴퓨터에서 N=1,000,000 처리 시:
operations_per_second = 100_000_000
scenarios = {
'O(log n)': 20,
'O(n)': 1_000_000,
'O(n log n)': 20_000_000,
'O(n²)': 1_000_000_000_000,
'O(2^n) when n=30': 2**30,
}
for name, ops in scenarios.items():
seconds = ops / operations_per_second
if seconds < 1:
print(f"{name:30} {seconds*1000:.3f}ms")
elif seconds < 60:
print(f"{name:30} {seconds:.1f}초")
elif seconds < 3600:
print(f"{name:30} {seconds/60:.1f}분")
elif seconds < 86400:
print(f"{name:30} {seconds/3600:.1f}시간")
else:
print(f"{name:30} {seconds/86400:.0f}일")다음 챕터
CH.8 "수열과 급수" — 반복문의 수학 + 등차/등비 수열 + 시그마(Σ) = reduce.
AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude
무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6
내 알고리즘 코드의 시간복잡도를 분석해서 O 표기법으로 평가하고 개선 방안을 우선순위로 알려줘.
ChatGPT
무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro
실제 한국 코딩 테스트에서 시간복잡도 문제로 떨어진 사례 10개와 각각의 정답 패턴을 알려줘.
Gemini
무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro
내 코드베이스 전체에서 가장 느린 함수 Top 10을 시간복잡도 + 데이터 크기로 분석해서 개선안을 만들어줘.
Grok
무료: Grok 4.1 / SuperGrok $30/mo
2026년 시니어 면접에서 시간복잡도 질문 빈도와 깊이를 실제 출제 사례로 솔직히 알려줘.
⭐ 이것만 기억하세요
지수와 로그: 빅데이터와 복잡도의 언어는 이 3가지만 확실히 잡으세요
1.지수는 빠르게 커지고 로그는 천천히 커진다 — 알고리즘 효율 평가의 가장 강력한 도구
2.이진 탐색이 O(log n)인 이유: 매번 절반으로 줄이기 = 2를 몇 번 곱해야 N이 되는가
3.다음 챕터 CH.8에서 수열·급수 — for 루프와 reduce가 수학의 무엇과 같은지
공유하기
진행도 7 / 15