📌

알고리즘에 대한 점근적 분석

알고리즘

🌟정확성과 효율성, 알고리즘에서 가장 중요한 속성

  1. 정확성 Correctness

2. 효율성 Efficiency

🐣 T(n) : 입력 크기 n에 대한 시간을 나타내는 함수로, 시간 복잡도를 나타냄!

🐣 S(n) : 입력 크기 n에 대한 메모리 사용을 나타내는 함수로, 공간 복잡도를 나타냄!

🌟점근적 분석 Asymptotic Analaysis

  • 데이터 집합이나 프로그래밍 언어와 관계없이 알고리즘 자체의 효율성을 비교하기 위해 사용되는 분석 방법으로, 증가차수*에 초점이 맞추어져 있음
  • * 증가차수 : "△(입력 양 증가 정도) ➡️ 알고리즘 수행 시간" 경향성을 나타내는 지표
  • 점근적 실행 시간 Asymptotic Running Time : 입력 양이 증가하는 정도에 따라 변화하는 알고리즘의 수행 시간! 정확한 시간은 아님!

  1. 🌟빅오 표기법 Big-O Notation

nnn0n_0에 대해서 조건  f(n) f(n)cg(n)cg(n) ➡️ f(n)=복잡도=O(g(n))f(n)=복잡도=O(g(n)) ↔️ f(n)= g(n)의 빅오(Big-O)[f(n): 내가 설정했던 복잡도] (단, n0>0,c>0n_0>0, c>0 ) ( ↔️즉, 입력크기 n이 커질 수록, 이에 대한 복잡도를 나타내는 f(n)함수에 대해서 cg(n)이 상한이 되는 조건!)

↔️ 입력크기 n이 충분히 크면, f(n)의 증가 속도 ≤ cg(n)

  • 상한 : 실행 시간이 최악일 경우, 상한 시간과 같거나 빠름
Big O Notation 빅오 표기법

예시)

O(n2)=n2+nO(n^2) = n^2 + n

↔️ 이 경우, 양수 n에 대해서

f(n)=n2+nf(n)=n^2+n , g(n)=n2g(n)=n^2

와 같이 두 함수 f(n), g(n)이 있을 때, c를 6 으로 선택(가정)해보고, 양수값 n에 대해서

f(n)f(n)6g(n)6*g(n) 이 되는 경우가 존재하는 지 확인해보자

n2+nn^2+n6n26*n^2 ↔️ 0 ≤5n2n5n^2 -n

↔️ 0 ≤ n(5n1)n(5n-1)

↔️ nn ≥ 0.2(=1/5) 이면 위에서 언급한 조건이 만족된다!

이 때, 조건을 만족하는 (c, n0n_0) = (6, 0.2) 를 "witness pair" 로 부를 수 있다!

(reference : http://www.cs.cornell.edu/courses/cs211/2005sp/Lectures/L14-BigO/L14-15-Complexity.4up.pdf)

f(n)=O(g(n))=n2f(n)=O(g(n))=n^2

2. 오메가 표기법 Omega Notation

nnn0n_0에 대해서 조건  f(n) f(n)cg(n)cg(n) ➡️ f(n)= Ω(g(n)) ↔️ f(n)= g(n)의 Ω(Omega)[f(n): 내가 설정했던 복잡도] (단, n0>0,c>0n_0>0, c>0 ) ( ↔️즉, 입력크기 n이 커질 수록, 이에 대한 복잡도를 나타내는 f(n)함수에 대해서 cg(n)이 하한이 되는 조건!)

↔️ 입력크기 n이 충분히 크면, f(n)의 증가 속도 ≥ cg(n)

  • 하한 : 실행 시간이 최악일 경우, 하한 시간과 같거나 느림

Omega Notation-오메가 표기법

예시)

f(n) = n2+nn^2+n , g(n) =n2n^2, c = 1 로 가정하자

n2+nn^2+nn2n^2

↔️ n ≥ 0 이면 f(n)≥g(n)이 성립!

f(n)=Ω(g(n))=Ω(n2)f(n)=Ω(g(n))=Ω(n^2)

3. 세타 표기법 Theta Notation

nnn0n_0에 대해서 조건 c1g(n)c_1g(n) f(n) f(n)c2g(n)c_2g(n) ➡️ f(n)= Θ(g(n)) ↔️ f(n)= g(n)의 Θ(Theta)[f(n): 내가 설정했던 복잡도] (단, n0>0,c1>0,c2>0n_0>0, c_1>0, c_2>0 ) ( ↔️ g(n) = f(n)에 대해 점근적 근접 한계값* Asymptotically Tight Bound) ↔️ f(n)은 g(n)과 같은 비율로 증가

Theta Notation-세타 표기법

  • * 점근적 근접 한계값 Asymptotically Tight Bound

: 점근적 상한과 점근적 하한의 교집합

예시)

f(n)=n3+n2+nf(n)=n^3+n^2+n, g(n)=n3g(n)=n^3, c1=1,c2=3c_1= 1, c_2 =3 가정

➡️ n3n^3n3+n2+nn^3+n^2+n3n33n^3

(1) n3n^3n3+n2+nn^3+n^2+n

↔️ n2+nn^2+n ≥ 0

↔️ n≥0 인 모든 값에 대해서 성립

(2) n3+n2+nn^3+n^2+n3n33n^3

↔️ 0 ≤ 2n3n2n2n^3-n^2-n

↔️ 0 ≤ n(2n2n1)n(2n^2-n-1)

↔️ 0 ≤ n(2n+1)(n1)n(2n+1)(n-1)

↔️ n≥1 이면 성립

f(n)=Θ(g(n))=Θ(n3)f(n)=Θ(g(n))=Θ(n^3)


예제) f(n)=2n2+n,g(n)=n2f(n)=2n^2+n, g(n)=n^2 의 관계를 각 표기법에서 살펴보기

(1) 빅오 표기법

c = 4 가정

2n2+n2n^2+n4n24n^2

2n2+n2n^2+n4n24n^2

↔️ 0 ≤ 2n2n2n^2 -n

↔️ 0 ≤ n(2n1)n(2n-1)

↔️ n ≥ 0.5 이면 성립!

f(n)=O(g(n))=n2f(n)=O(g(n))=n^2

(2) 오메가 표기법

c =1 가정

2n2+n2n^2+nn2n^2

↔️ n2+nn^2+n ≥ 0

↔️ nn ≥ 0 이면 성립!

f(n)=Ω(g(n))=Ω(n2)f(n)=Ω(g(n))=Ω(n^2)

(3) 세타 표기법

c1c_1= ,2 c2=c_2=6가정

2n2n^22n2+n2n^2+n ≤ 6n2n^2

i) 2n22n^22n2+n2n^2+n

↔️ n ≥ 0 이면 성립!

ii) 2n2+n2n^2+n 6n26n^2

↔️ 0 ≤ 4n2n4n^2-n

↔️ 0 ≤ n(4n1)n(4n-1)

↔️ n ≥ 0.25 이면 성립!

∴ n ≥ 0.25 면 성립!!

f(n)=Θ(g(n))=Θ(n2)f(n)=Θ(g(n))=Θ(n^2)


(비유) LinkedList와 ArrayList는 각각 중간에서 삽입하느냐, 앞뒤에서 데이터를 삽입하느냐에 따라 성능의 차이가 존재한다

하지만, 데이터가 커지면 LinkedList가 훨씬 유리한 반면, 삽입되는 데이터 양이 작으면 비슷하거나 어느 한쪽이 더 우세하다

이 관점을 끌고 하나의 예시를 살펴보자

f(n)=1000nlog(n),g(n)=n2f(n) = 1000 * n * log(n), g(n) = n^2

위와 같은 복잡도 함수에서 상수는 무시되므로, f(n)이 보다 우세하다!

하지만!! n<1000 인 경우에서는 g(n)이 더 빠르게 실행될 수 있다!

즉, 상황에 따라서 상대적으로 적용될 수 있음을 잊지 말자!