수학 개념 지도
알고리즘(Algorithm)

점근 표기법(Asymptotic notation)

입력 크기 n이 커질 때 걸음 수가 어떤 속도⁠(velocity)⁠로 자라는지를 상수배를 무시하고 적는 표기. O(n), O(n log n), O(n²), O(2ⁿ)의 차이는 n이 클수록 압도적이다.

f(n)=O(g(n))  ⟺  ∃ c>0, n0: f(n)≤c g(n)  for all n≥n0f(n) = O(g(n)) \iff \exists\, c > 0,\ n_0 :\ f(n) \le c\, g(n) \ \text{ for all } n \ge n_0
먼저 보면 좋은 개념함수극한자연로그

알고리즘⁠(algorithm)⁠이 얼마나 빠른지는 컴퓨터와 언어, 프로그래머의 솜씨에 따라 달라집니다. 그런 것에 흔들리지 않게 비교하려고, 입력의 크기 n에 대한 걸음 수 f(n)f(n)을 세고 n이 커질 때 가장 빨리 자라는 부분만 남깁니다. 같은 크기의 입력이라도 걸음 수가 다를 수 있으니, 따로 말하지 않으면 크기가 n인 입력 가운데 가장 오래 걸리는 것(최악의 경우)을 셉니다. 상수배와 작은 항은 버립니다. 3n2+20n+503n^2 + 20n + 50걸음 걸리는 알고리즘은 그냥 O(n2)O(n^2)이라고 씁니다.

이렇게 거칠게 봐도 되는 까닭은, n이 커지면 자라는 빠르기의 차이가 상수배 따위를 압도하기 때문입니다. n=n = 을 키워 보세요. 세로축: .

log₂ n(청록), n(파랑), n log₂ n(보라), n²(노랑), 2ⁿ(분홍). 보통 눈금에서는 지금 n에서의 n²이 늘 보이도록 화면이 따라 물러납니다.

지금 걸음 수는 log⁡2n≈\log_2 n \approx , nlog⁡2n≈n \log_2 n \approx , n2=n^2 = , 2n≈2^n \approx 입니다. 1초에 10억 걸음을 가는 컴퓨터로 n2n^2걸음은 , 2n2^n걸음은 걸립니다. 로그 log⁡2n\log_2 n은 n을 천 배로 늘려도 10쯤 늘 뿐이고, 지수함수⁠(exponential function)⁠ 2n2^n은 n이 하나 늘 때마다 두 배가 되어 n = 100이면 이 컴퓨터로 약 40조 년, 우주 나이(약 138억 년)의 수천 배가 걸립니다. 그래서 걸음 수가 n의 다항식⁠(polynomial)⁠으로 묶이는 알고리즘을 '빠르다'고 부르고, 그런 알고리즘으로 풀리는 예/아니오 문제들의 모임을 P라고 합니다(P 대 NP 문제⁠(P versus NP problem)⁠).

정확한 뜻은 위의 식입니다. 어떤 상수 c와 문턱⁠(threshold)⁠ n0n_0이 있어서 그 뒤로는 f가 g의 c배를 넘지 않으면 f=O(g)f = O(g)입니다. 아래 그림에서 파란 곡선은 f(n)=3n2+20n+50f(n) = 3n^2 + 20n + 50, 노란 곡선은 c⋅g(n)c \cdot g(n)입니다. g(n)=g(n) = , c=c = .

문턱 n₀(분홍 세로선)의 오른쪽에서는 노란 곡선이 언제나 파란 곡선 위에 있어야 합니다.

g가 n2n^2일 때 c가 3 이하이면 아무리 멀리 가도 안 되고, 3보다 조금만 크면 문턱이 아주 멀리 생깁니다. 결국 충분히 큰 n에서 f/gf/g가 어떤 유한한 값 아래로 묶이느냐의 문제입니다. 그래서 극한⁠(limit)⁠ lim⁡n→∞f(n)/g(n)\lim_{n\to\infty} f(n)/g(n)이 유한한 값으로 있으면 f=O(g)f = O(g)입니다. 여기서는 그 극한이 3이니 c가 3보다 크기만 하면 됩니다(극한이 없어도 비가 묶여 있기만 하면 됩니다).

OO는 위쪽 한계만 말합니다. 그래서 3n2+20n+503n^2 + 20n + 50은 O(n3)O(n^3)이기도 합니다. 참이지만 덜 알려 주는 말입니다. 흔히 'O(n²)이다'를 '정확히 n²만큼 자란다'로 읽지만, 그 뜻은 따로 Θ\Theta가 맡습니다. 아래쪽 한계는 Ω\Omega(충분히 큰 n에서 늘 f≥c gf \ge c\,g인 양수 c가 있다), 위아래가 모두 같은 차수이면 Θ\Theta로 씁니다. 비교로 정렬하려면 최악의 경우 Ω(nlog⁡n)\Omega(n \log n)번 비교해야 한다는 비교 정렬의 하한⁠(comparison sorting lower bound)⁠이 Ω\Omega의 대표적인 예입니다. O 표기는 1894년 독일의 수학자 파울 바흐만이 정수론⁠(number theory)⁠ 책에서 쓰고, 에드문트 란다우가 1909년 책에서 널리 퍼뜨렸습니다. 1976년 미국의 컴퓨터 과학자 크누스는 Ω\Omega와 Θ\Theta의 뜻을 지금처럼 정해 알고리즘 분석⁠(analysis of algorithms)⁠에 들여왔습니다.

이어지는 곳. 같은 말투가 수학 곳곳에 나옵니다. N 이하 소수⁠(prime number)⁠의 개수를 어림하는 소수 정리⁠(prime number theorem)⁠에서는 어림값과 참값의 차이(오차항)가 얼마나 빨리 자라는지를 O로 적습니다. 함수⁠(function)⁠가 충분히 매끄러우면 테일러 급수⁠(Taylor series)⁠를 n차에서 끊었을 때 남는 부분은 O(xn+1)O(x^{n+1})인데, 여기서는 n이 커질 때가 아니라 x가 0에 다가갈 때 xn+1x^{n+1}의 상수배를 넘지 않는다는 뜻입니다. 스털링 공식⁠(Stirling's formula)⁠의 ln⁡n!=nln⁡n−n+O(ln⁡n)\ln n! = n \ln n - n + O(\ln n)도 같은 말투입니다. 알고리즘에서는 찾는 범위를 반씩 줄이는 이진 탐색⁠(binary search)⁠의 O(log⁡n)O(\log n), 좋은 정렬의 O(nlog⁡n)O(n \log n), 목록 크기와 상관없이 평균⁠(mean)⁠ 일정한 걸음에 찾는 해시 테이블⁠(hash table)⁠의 O(1)O(1)이 이 잣대로 비교됩니다. 조화급수⁠(harmonic series)⁠가 ln⁡n+O(1)\ln n + O(1)이라는 사실은 퀵정렬⁠(quicksort)⁠의 평균 비교 횟수에서 다시 나옵니다.

이 개념이 나오는 긴 글

계산 이론 기계가 풀 수 없는 문제 모든 수학 문제를 기계적으로 풀 수 있을까? 러셀의 역설에서 괴델과 튜링까지, 그 질문에 대한 답은 '아니오'였고, 그 증명이 컴퓨터를 낳았다. 조합론 세지 않고 세기 시의 운율을 세던 인도의 운율학자부터 오일러의 생성함수까지. 하나하나 늘어놓지 않고 경우의 수를 세는 법은 어떻게 자라났을까? 매칭과 흐름 짝을 찾는 알고리즘 의대 졸업생과 병원, 신장 기증자와 환자, 철도와 화물. 누구를 누구와 이을지 정하는 수학은 냉전의 철도 지도에서 노벨 경제학상까지 이어진다. 알고리즘과 복잡도 줄 세우기의 한계 카드 천 장을 가장 빨리 줄 세우는 방법은? 인구조사의 천공 카드에서 퀵정렬까지, 그리고 어떤 방법도 넘을 수 없는 n log n의 벽. 신경망과 기계 학습 배우는 기계 예를 보여 주면 규칙을 스스로 찾는 기계. 1958년의 퍼셉트론에서 오늘의 심층 신경망까지, 그 밑바닥에는 미분과 연쇄법칙이 있다. 언어 모델 다음 단어를 맞히는 기계 다음 낱말을 짐작하는 일만으로 어디까지 갈 수 있을까? 마르코프의 글자 세기에서 섀넌의 추측 게임, 트랜스포머와 규모의 법칙, 사람의 선호까지. 밑바닥에는 확률의 곱셈 규칙과 로그 하나가 있고, 그 수학은 모델이 왜 그럴듯하게 틀리는지도 말해 준다.

이 개념 위에 세워진 것

이 개념을 언급하는 페이지

이 페이지가 가리키는 개념