[알고리즘] 03. Growth of Functions

jmt·2024년 3월 23일

알고리즘

목록 보기
3/18

경북대 COMP0319 강의 기반의 정리
Introduction to algorithms 3판 참고

Order or Growth

지난 시간에 정렬 문제를 해결하기 위해 삽입 정렬과 병합 정렬, 2개를 알아보았다. 삽입 정렬은 최악의 경우 an2+bn+can^2 + bn + c의 계산시간이, 병합 정렬은 c1nlogn+c2nc_1n \log n + c_2n임을 알아보았다. 병합 정렬의 최악의 경우에 T(n)T(n)을 알아보기 위해 Order of Growth라는 방법을 적용해보자.

삽입 정렬

삽입 정렬에서 각 code line마다 소모되는 비용 c1,c2,...c_1, c_2, ...를 간단히 하기 위해 T(n)=an2+bn+cT(n) = an^2 + bn + c로 표기하였는데 더 간단한 방법이 바로 Order of Growth이다. 이 방법은 우리가 실제 관심있는 실행시간에 영향을 주는 요소들에 더 집중한다. 그게 바로 차수가 가장 큰 항이다. 삽입 정렬의 경우에는 an2an^2이 된다. 가장 차수가 큰 항만을 고려하는 이유는 차수가 더 작은 항들은 상대적으로 총 실행시간에 영향을 덜 미치기 때문이다. 또한 여기서 큰 input에 대해서는 계수도 영향도가 낮기에 계수도 무시한다. 그럼 최종적으로 삽입 정렬의 worst case의 경우 T(n)T(n)n2n^2이 된다. 이를 이제 Θ(n2)\Theta (n^2)라 하자.

병합 정렬

병합 정렬의 경우 문제의 크기가 ncn \le c로 충분히 작다면, T(n)T(n)은 상수로 나타내지게 된다. 그러므로 Order of Growth를 적용하면 Θ(1)\Theta(1)로 표현할 수 있다.
이제 n>1n > 1의 경우를 따져보자. 이 때 병합 정렬은 문제의 크기를 2개로 나누고 나눈 문제의 크기는 2배 줄인다는 것을 배웠다. 또한 여기에 나누는데 소모되는 비용(divide), D(n)D(n)과 합치는데 소모되는 비용(combine), C(n)C(n)을 더하게 되면 T(n)T(n)T(n)=2T(n/2)+D(n)+C(n)T(n) = 2T(n/2) + D(n) + C(n)이다. 여기에 Order of Growth를 적용하면 최종적으로 병합 정렬의 T(n)T(n)은 다음과 같다.

T(n)={Θ(1)(n=1)2T(n/2)+Θ(n)(n>1)T(n) = \begin{cases} \Theta(1)\quad\quad\quad\quad\quad\quad(n=1)\\ 2T(n/2) + \Theta(n)\quad\,(n>1) \end{cases}

즉 최악의 경우 병합 정렬의 경우 이전에 배운 재귀 트리를 사용하면 T(n)=Θ(nlogn)T(n) = \Theta(n\log n)이 된다. 그러므로 우리는 병합 정렬이 삽입 정렬보다 알고리즘의 효율성이 높다고 할 수 있다.

점근적 표기법(Asymptotic Notation)

Order of Growth를 통해 알고리즘의 효율성을 간략하게 확인할 수 있고 이를 통해 우리는 어떤 알고리즘이 상대적으로 더 효율적인지를 파악할 수 있다. 점근적 표기법은 Order of Growth처럼 큰 크기의 문제 사이즈 nn에 대한 알고리즘의 효율성을 따지는 방법이다. 즉, 입력의 크기가 한계 없이 증가함에 따라 알고리즘의 실행 시간이 어떻게 증가되는지 확인할 수 있다. 이 말은 점근적 표기법을 통해 알고리즘의 효율성을 따지면, 아주 작은 크기를 제외한 모든 입력에 대해 점근적으로 더 큰 효율적인 알고리즘이 최선의 선택이 될 수 있다. 그럼 점근적 표기법을 알아보자.

Θ\Theta-Notation

최악의 경우 삽입 정렬의 실행 시간은 T(n)=Θ(n2)T(n) = \Theta(n^2)으로 표현하였다. 그럼 Θ\Theta는 무슨 의미를 가질까? 주어진 함수 g(n)g(n)에 대해 Θ(g(n))\Theta(g(n))은 다음과 같은 의미를 가진다.

Θ(g(n))\Theta(g(n)) = {f(n)f(n) : there exist positive constants c1,c2,c_1, c_2, and n0n_0 such that 0c1g(n)f(n)c2g(n)0 \le c_1g(n) \le f(n) \le c_2g(n) for all nn0n \ge n_0}.

함수 f(n)f(n)Θ(g(n))\Theta(g(n))에 속한다는 것을 f(n)=Θ(g(n))f(n) = \Theta(g(n))으로 표기할 수 있다. Θ(g(n))\Theta(g(n))에 속한다는 의미는 양인 상수 c1,c2c_1, c_2에 대해 c1g(n)c_1 g(n)c2g(n)c_2 g(n) 사이에 f(n)f(n)이 존재한다는 의미로, "sandwiched"라는 뜻이다. 엄밀하게 따지면 f(n)Θ(g(n))f(n) \in \Theta(g(n))으로 표기해야하지만 여기서는 ==기호를 사용하도록 하자.

Example 1)

T(n)=n(n1)2T(n)=\frac{n(n-1)}{2}라면 T(n)Θ(n2)T(n) \in \Theta(n^2)라 할 수 있는가?

Solution

n0=1n_0 = 1이라 두자. 이 때 0c1n2T(n)c2n20 \le c_1 n^2 \le T(n) \le c_2 n^2을 만족하는 c1c_1c2c_2가 존재하면 된다.

c1n212n212nc2n2c11212nc2\begin{aligned} c_1 n^2 &\le \frac{1}{2}n^2 - \frac{1}{2}n \le c_2 n^2\\ c_1 &\le \frac{1}{2} - \frac{1}{2n} \le c_2\\ \end{aligned}

n1n\ge1일 때, 가능한 c1,c2c_1, c_2가 존재할 수 있기 때문에 Θ(n2)\Theta(n^2)에 속한다고 할 수 있다.

O-Notation

f(n)=O(g(n))f(n) = O(g(n)) 혹은 f(n)O(g(n))f(n) \in O(g(n))의 의미는 다음과 같다.

O(g(n))O(g(n)) = {f(n)f(n) : there exist positive constants cc and n0n_0 such that 0f(n)cg(n)0 \le f(n) \le cg(n) for all nn0n \ge n_0}.

O-notation은 상한선(upper bound)를 의미한다. 즉 최악의 경우 총 계산 시간이 어떻게 되는지를 알고 싶을 때 사용한다.

Example 1)

T(n)=n(n1)2T(n) = \frac{n(n-1)}{2} 일 때, T(n)O(n2)T(n) \in O(n^2)인가?

Solution

0T(n)cn2012n212ncn201212nc\begin{aligned} 0 &\le T(n) \le cn^2\\ 0 &\le \frac{1}{2}n^2 - \frac{1}{2}n \le cn^2\\ 0 &\le \frac{1}{2} - \frac{1}{2n} \le c \end{aligned}

n0n \neq 0일 때, c=1/2c=1/2이면 10-1 \le 0이므로 등호가 성립한다. 즉, O(n2)O(n^2)에 속한다.

Ω(n2)\Omega(n^2)-Notation

Θ(g(n))\Theta(g(n)) = {f(n)f(n) : there exist positive constants cc and n0n_0 such that 0cg(n)f(n)0 \le cg(n) \le f(n) for all nn0n \ge n_0}.

O-notation와 비슷하다. 다만 부호의 차이로 Ω\Omega-notation은 하한선을 의미한다. 즉, 최선의 경우의 총 실행시간을 의미한다.

Example 1)

T(n)=n(n1)2Ω(n2)T(n) = \frac{n(n-1)}{2} \in \Omega(n^2) ?

Solution

0cn2T(n)0cn212n212n0cn12n12\begin{aligned} 0 &\le cn^2 \le T(n)\\ 0 &\le cn^2 \le \frac{1}{2}n^2 - \frac{1}{2}n\\ 0 &\le cn \le \frac{1}{2}n - \frac{1}{2} \end{aligned}

c=1/4,n0=2c=1/4, n_0=2이면 위 등호가 만족하므로 T(n)Ω(n2)T(n) \in \Omega(n^2)이다.

결론

알고리즘의 효율성을 따져보기 위해 최악의 경우를 고려했다. 최악의 경우의 알고리즘의 총 계산시간을 비교하기 위해 우리는 Order of Growth처럼 nn의 크기가(문제의 크기가) 충분히 큰 경우를 고려해 점근적 표기법으로 나타내는 방법을 배웠다. 병합 정렬의 계산 시간을 Θ\Theta-notation으로 표현할 때처럼 T(n)T(n)이 점화식(Recurrences)로 되어 있는 경우에 어떻게 구하는지를 다음시간에 알아보자.

profile
고분자/컴공

0개의 댓글