Complexity
- O : Big O, asymptotic upper bound
- Ω : Omega, asymptotic lower bound
- Θ : Theta, order, asymtotic tight bound (O ∩ Ω)
대표적인 복잡도 카테고리
- Θ(lg n)
- Θ(n) : 1차 (linear time algorithm)
- Θ(n lg n)
- Θ(n2) : 2차 (quadratic time algorithm)
- Θ(n3) : 3차 (cubic time algorithm)
- Θ(2n) : 지수 (exponential time algorithm)
- Θ(n!)
Big O 표기법
- 정의 : 점근적 상한 (Asymptotic Upper Bound)
- 주어진 복잡도 함수 f(n)에 대해서 g(n) ∈ O(f(n))이면 다음을 만족한다 (g(n) : 분석된 결과)
- g(n) ≤ c x f(n)
- g(n) ∈ O(f(n)) : g(n)은 f(n)의 큰 오 (big O)
- 어떤 함수 g(n)이 O(n2)에 속한다는 말은
- 그 함수 (g(n))는 궁극에 가서는 (즉, 어떤 임의의 N값보다 큰 값에 대해서는) 어떤 2차 함수 cn2보다는 작은 값을 가지게 된다는 것을 뜻한다. (그래프 상에서는 아래에 위치)
- 즉 g(n)은 어떤 2차 함수 cn2보다는 궁극적으로 좋다고 (기울기가 낮다고) 말할 수 있다.
- 어떤 알고리즘의 시간 복잡도가 O(f(n))이라면
- 입력의 크기 n에 대해서 이 알고리즘의 수행시간은 아무리 늦어도 f(n)은 된다. (f(n)이 상한이다.)
- 다시 말하면, 이 알고리즘의 수행시간은 f(n)보다 절대로 더 느릴 수는 없다는 말이다.
Ω 표기법
- 정의 : 점근적 하한 (Asymptotic Lower Bound)
- 주어진 복잡도 함수 f(n)에 대해서 g(n) ∈ Ω(f(n)) 이면 다음을 만족한다 (g(n) : 분석된 결과)
- g(n) ≥ c x f(n)
- g(n) ∈ Ω(f(n)) : g(n)은 f(n)의 오메가 (omega)
- 어떤 함수 g(n)이 Ω(n)에 속한다는 말은
- 그 함수 (g(n))는 궁극에 가서는 (즉, 어떤 임의의 N값보다 큰 값에 대해서는) 어떤 2차 함수 cn2보다는 큰 값을 가지게 된다는 것을 뜻한다. (그래프 상에서는 위에 위치)
- 즉 g(n)은 어떤 2차 함수 cn2보다는 궁극적으로 나쁘다고 (기울기가 높다고) 말할 수 있다.
- 어떤 알고리즘의 시간 복잡도가 O(f(n))이라면
- 입력의 크기 n에 대해서 이 알고리즘의 수행시간은 아무리 빨라도 f(n)밖에 되지 않는다. (f(n)이 하한이다.)
- 다시 말하면, 이 알고리즘의 수행시간은 f(n)보다 절대로 더 빠를 수는 없다는 말이다.
Θ 표기법
- 정의 : Asymptotic Tight Bound
- Θ(f(n)) = O(f(n)) ∩ Ω(f(n))
- c x f(n) ≤ g(n) ≤ d x f(n)
- g(n) ∈ Θ(f(n))은 "g(n)은 f(n)의 차수 (order)"라고 한다.
small o 표기법
- 작은 o는 복잡도 함수끼리의 관계를 나타내기 위한 표기법
- 정의 : 작은 o
- Big O에 속하는 값 중 최고차항이 더 큰 원소들
- g(n) ≤ c x f(n)
- g(n) ∈ o(f(n))은 "g(n)은 f(n)의 작은 오 (o)"라고 한다.
- 큰 O와의 차이점
- 큰 O : 실수 c > O 중에서 하나만 성립하여도 됨
- 작은 o : 모든 실수 c > o에 대해서 성립하여야 함
- g(n) ∈ o(f(n))은 g(n)이 궁극적으로 f(n)보다 훨씬 낫다(좋다)는 의미이다.
차수의 주요 성질
- g(n) ∈ O(f(n)) iff f(n) ∈ Ω(g(n))
- g(n) ∈ Θ(f(n)) iff f(n) ∈ Θ(g(n))
- b > 1이고 a > 1이면, logan ∈ Θ(logbn)은 항상 성립. 로그 (logarithm) 복잡도 함수는 모두 같은 카테고리에 속한다. 따라서 통상 Θ(lg n)으로 표시한다.
- b > a > o이면, an ∈ o(bn). 지수 (exponential) 복잡도 함수가 모두 같은 카테고리 안에 있는 것은 아니다.
- a > 0인 모든 a에 대해서 an ∈ o(n!). n!은 어떤 지수 복잡도 함수보다도 나쁘다.
- 복잡도 함수를 다음 순으로 나열해보자. Θ(lg n), Θ(n), Θ(n lg n), Θ(n2), Θ(nj), Θ(nk), Θ(an), Θ(bn), Θ(n!) 여기서 k > j > 2이고, b > a> 1이다. 복잡도 함수 g(n)이 f(n)을 포함한 카테고리의 왼쪽에 위치한다고 하면, g(n) ∈ o(f(n))
- c ≥ 0, d > 0, g(n) ∈ O(f(n)), 그리고 h(n) ∈ Θ(f(n))이면, c x g(n) + d x h(n) ∈ Θ(f(n))
'프로그래밍 > 알고리즘' 카테고리의 다른 글
Binary Search (0) | 2020.09.19 |
---|---|
Divide-and-Conquer (0) | 2020.09.19 |
알고리즘 분석 (0) | 2020.09.14 |
피보나치 수 구하기 알고리즘 (0) | 2020.09.10 |
알고리즘이란 (0) | 2020.09.10 |