๊ตญ๋ฏผ๋ํ๊ต์์ "์ฝ๊ฒ ๋ฐฐ์ฐ๋ ์๊ณ ๋ฆฌ์ฆ" ๊ต์ฌ๋ฅผ ์ด์ฉํ
๋ฐํ๋ช ๊ต์๋์ ๊ฐ์ ๊ต์์ ์ด์ฉํ์ฌ ์์ ๋ด์ฉ์ ์ ๋ฆฌํ์์ต๋๋ค
Algorithm Analysis
์๊ณ ๋ฆฌ์ฆ : ์ด๋ค ๋ฌธ์ (Problem)๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ ์ฐจ๋ ๋ฐฉ๋ฒ์ ๊ณต์ํํ ํํ๋ก ํํํ ๊ฒ
=> ์ฌ๊ธฐ์ ๋ฌธ์ ๋ ์ ๋ ฅ(Input)๊ณผ ์ถ๋ ฅ(Output)์ ๊ด๊ณ
์ ๋ ฌ ๋ฌธ์ ๋ฅผ ์์๋ก ๋ดค์ ๋
Input : ์ ๋ ฌ๋์ง ์์ ์ซ์๋ค์ ๋ชฉ๋ก
Output : ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ์ซ์๋ค์ ๋ชฉ๋ก
ํ ๋ฌธ์ ๋ ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด๊ฒฐํ ์ ์์
Problem : n์ n๋ฒ ๋ํ ๊ฐ์?
๋๊ฐ๋ด๋ 3๋ฒ์ ์ฑํํ ํ ๋ฐ
๊ฐ์ฅ ํจ์จ์ ์ด๊ณ ์ฐ๊ธฐ ์ข์ ์๊ณ ๋ฆฌ์ฆ์ ์ ํํด์ผํ๊ณ ์ด๊ฒ์ ๊ณง ํจ์จ์ฑ๊ณผ ์ฉ์ด์ฑ์ด ์ข๋ค๋ ์๋ฏธ
(์๊ณ ๋ฆฌ์ฆ์์๋ ํจ์จ์ฑ์ ์ฃผ๋ก ์ ๊ฒฝ์)
๊ทธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ํจ์จ์ฑ์ ์ด๋ป๊ฒ ์ธก์ ํ ๊น?
ํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ด๋ ํ์ ๋ ์์์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์
=> ์์(Resource)์๋ ์๊ฐ, ๊ณต๊ฐ ๋ฑ์ด ์์
(์ฌ๊ธฐ์ ๊ณต๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์๋ฏธ)
ํจ์จ์ฑ ์ธก์ ๋ฐฉ๋ฒ์๋ ์ค์ ๋ก ๋๋ ค๋ณด๊ณ ์ธก์ ํ๋ ์คํ์ (Empirical) ๋ฐฉ๋ฒ๊ณผ ๊ธฐ๋ณธ ์ฐ์ฐ ์๋ฅผ ์ธ๋ ์ด๋ก ์ (Theoretical) ๋ฐฉ๋ฒ์ด ์์
์คํ์ ๋ฐฉ๋ฒ
- time() ์ ์ด์ฉํด ์๊ณ ๋ฆฌ์ฆ ์์ ์ , ํ ์๊ฐ์ ์ฐจ๋ฅผ ์ด์ฉํ์ฌ ์๊ฐ์ ์ธก์
- ์คํ ์ค๊ฐ๋ง๋ค memory_info()๋ฅผ ํธ์ถํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ธก์
- ์ง๊ด์ ์ด๋ผ๋ ์ฅ์ ์ด ์์
- ๊ธฐ๊ธฐ, OS, ์ธ์ด, ๊ตฌํ๋ฐฉ๋ฒ ๋ฑ ํ๊ฒฝ์ ๋ฐ๋ผ ๊ฐ๋ณ์ ์ด๋ผ๋ ๋จ์ ์ด ์์
- ์
๋ ฅ ํฌ๊ธฐ์ ๋ฐ๋ฅธ ์ฑ๋ฅ์ ๊ฒฝํฅ์ฑ ํ์
์ด ์ด๋ ค์ (๋ค์ํ ์
๋ ฅ ํฌ๊ธฐ์ ๋ํด ์คํ์ ํด์ผ ์ฑ๋ฅ์ ๋ณํ๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๋ถ์ ๊ฐ๋ฅ)
=> ์ ๋ ฅ ํฌ๊ธฐ๋ณ๋ก ์ ๋ถ ์คํํด๋ด์ผ ์ ์ ์์
์ด๋ก ์ ๋ฐฉ๋ฒ
๋ณต์ก๋ ๋ถ์(Complexity Analysis)
- ์๊ฐ ๋ณต์ก๋ (Time Complexity) : ๊ธฐ๋ณธ ์ฐ์ฐ์ ์
(n๊ฐ์ ์ ๋ ฅ์ผ ๋ ๊ธฐ๋ณธ ์ฐ์ฐ์ n ๋งํผ ์ฌ์ฉํ๋์ง n^2 ๋งํผ ์ฌ์ฉํ๋์ง๋ฅผ ๋ํ๋) - ๊ณต๊ฐ ๋ณต์ก๋ (Space Complexity) : ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋
(์ฌ์ฉํ๋ ๋ณ์์ ์์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋จ)
๊ธฐ๋ณธ ์ฐ์ฐ์ด๋?
์ฌ์น์ฐ์ฐ (+, -, *, /) , ๋์ ์ฐ์ฐ (=), ๋น๊ต์ฐ์ฐ(<, <=, ..) ๋ฑ๋ฑ
๋๊ฐ, ๋ณต์ก๋๋ ์ ๋ ฅ ๋ฐ์ดํฐ์ ํฌ๊ธฐ n์ ์ํด ๊ฒฐ์ ๋จ
- T(n) : ์ ๋ ฅ n์ ๋ํ ์๊ฐ ๋ณต์ก๋ ํจ์
- S(n) : ์ ๋ ฅ n์ ๋ํ ๊ณต๊ฐ ๋ณต์ก๋ ํจ์
Best, Worst and Average Cases
์ ๋ ฅ ํฌ๊ธฐ๊ฐ ๊ฐ์๋ ์ ๋ ฅ์ ๋ฐ๋ผ ๋ณต์ก๋๊ฐ ๋ค๋ฅผ ์ ์์!
=> ๊ฒฝ์ฐ๋ฅผ ๋๋ ์ ๋ถ์ํ์
- Best case : ๊ฐ์ฅ ์ ์ ์์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- Average case : ํ๊ท ์ ์ผ๋ก ์์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
(์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ์ฑ๋ฅ) - Worst case : ๊ฐ์ฅ ๋ง์ ์์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
(์ฑ๋ฅ ๋ณด์ฅ์ ํ์ฉ : ์ด๋ค ๊ฒฝ์ฐ๋ผ๋ ์ด๋ณด๋ค๋ ์ข์)
Best case๋ฅผ ๊ณ ๋ คํ ์ผ์ด ์์๊น..?
์ ๋ ฅ์ best case์ ๋น์ทํ๊ฒ ๋ง์ถ ๊ฒฝ์ฐ best case๊ฐ ์ค์ํ ์ ์์!
์์
Best case : T(n) = 1
=> q๊ฐ nums์ ๊ฐ์ฅ ์์ ์๋ ๊ฒฝ์ฐ
Worst case : T(n) = n
=> q๊ฐ nums์ ๊ฐ์ฅ ๋ง์ง๋ง์ ์๊ฑฐ๋, ์์ ์๋ ๊ฒฝ์ฐ
Average case : T(n) = (n+1)/2
=> ๊ฐ์ด ์กด์ฌํ๋ค๊ณ ๊ฐ์ ํ์ ๋ ๋ชจ๋ ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ๊ธฐ๋๊ฐ
Average case๋ฅผ ๊ตฌํ ๋ ๊ฐ ์์น์์ q๊ฐ ๋ฐ๊ฒฌ๋ ํ๋ฅ ์ 1/n ์ด๊ณ
- ์ฒซ ๋ฒ์งธ ์์น์์ ๋ฐ๊ฒฌ๋๋ฉด 1๋ฒ ๋น๊ต
- ๋ ๋ฒ์งธ ์์น์์ ๋ฐ๊ฒฌ๋๋ฉด 2๋ฒ ๋น๊ต
- …
- ๋ง์ง๋ง ์์น์์ ๋ฐ๊ฒฌ๋๋ฉด n๋ฒ ๋น๊ต
์ด๋ฏ๋ก ์๊ทธ๋ง 1~n ๊น์ง ๊ณ์ฐํ๋ฉด n(n+1) / 2 ์ฌ์ ํด๋น ์์ด ๋์ด!
Asymptotic Analysis
Introduction to Asymptotic Analysis
์๊ณ ๋ฆฌ์ฆ์ ๋ถ์ํ๋ ค๋ฉด ํญ์ ๊ธฐ๋ณธ ์ฐ์ฐ ์๋ฅผ ์ผ์ผ์ด ์ธ์ผ ํ ๊น?
์ ํํ ์ฐ์ฐ ์๋ฅผ ์ธ๋ ๊ฒ ๋ณด๋ค ์ ๋ ฅ ํฌ๊ธฐ์ ๋ฐ๋ผ ์ฐ์ฐ ์๊ฐ ๋ณํ๋ ๊ฒฝํฅ์ ํ์ ํ๋ ๊ฒ์ด ์ค์ํจ
=> ๋๋ต์ ์ผ๋ก ์ธ๋ ๊ฒ์ด ๋ณดํธ์ (์ ๊ทผ์ ๋ถ์๋ฒ์ ์ฌ์ฉํ์)
์ ๊ทผ์ ๋ถ์(Asymptotic Analysis)
์ ๋ ฅ ํฌ๊ธฐ๊ฐ ์์ฃผ ํด ๋์ ๋ณต์ก๋ ๋ถ์์ด๋ค
=> ๋ฌดํ๋๋ก ๊ทผ์ ํ๋ค๊ณ ์๊ฐํ๋ฉด ๋ถ์์ด ๊ฐ๋จํด์ง!
(n์ด ๋ฌดํ๋๋ก ๊ทผ์ ํจ์ ๋ฐ๋ผ ํจ์๊ฐ ๋ณํํ๋ ์์์ ์ดํด๋ณด์๋ ๋ป)
์ ์ ๋ ฅ ํฌ๊ธฐ๊ฐ ํด ๋๋ฅผ ๋ถ์ํ ๊น?
์ ๋ ฅ ํฌ๊ธฐ๊ฐ ์์ ๋ ์ด์ฐจํผ ๋ณต์ก๋๊ฐ ๋ฎ์ (์ ๋ถ ๋นจ๋ฆฌ ์คํ๋จ)
๋ํ ์ฐ์ธํญ(Dominant Factor) ๋ง ์ฐพ์ผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๋ถ์์ด ๋จ์ํด์ง
=> ์์ ๊ณ์(Constant Coefficient) ๋ ๋ฌด์ ๊ฐ๋ฅ
์ ๋ง ์ ๋ ฅ n์ด ์ปค์ง์ ๋ฐ๋ผ ์์ ๊ณ์๋ฅผ ๋ฌด์ํ ์ ์์๊น?
Algorithm A : T(n) = 2^n
Algorithm B : T(n) = n^10
๋ผ๊ณ ํ ๋
n์ด ์ปค์ง๋ฉด ๊ฒฐ๊ตญ Algorithm B๊ฐ ๋น ๋ฅด๋ค๋ ๊ฒ์ ์ ์ ์์
Algorithm B ์ T(n)์ ์์ 1000์ ๋ถ์ฌ T(n) = 1000 x n^10 ์ผ๋ก ๋ง๋ ๋ค๊ณ ํ๋๋ผ๋
n์ด ์ปค์ง๋ฉด ๊ฒฐ๊ตญ Algorithm B๊ฐ ๋น ๋ฅด๋ค๋ ๊ฒ์ ์ ์ ์์
=> ์์๋ ๋ฌด์ํ ์ ์๋ค!
๋ณต์ก๋ ํจ์์ ์์ด์ ์ด๋ป๊ฒ ๋ ๊น?
Big-O, Big-Omega, Big-Theta
์ ๊ทผ์ ํ๊ธฐ๋ฒ(Asymptotic Notations)๋ ์ฐ๋ฆฌ๊ฐ ์์ ๋ค๋ค๋ ์ ๊ทผ์ ๋ถ์(์ฐ์ธํญ๋ง ๋ณด๊ณ , ์์ ๊ณ์๋ ๋ฌด์ํ๊ณ ...)์ ์ํ์ ์ผ๋ก ๋ช ํํ๊ฒ ์ ์ํ๊ธฐ ์ํ ํ๊ธฐ๋ฒ์ด๋ค!
- Big-O Notation
=> n์ด ์์ฃผ ํด ๋ c · f(n) ๋ณด๋ค ๊ฐ์ด ์์ ํจ์์ ์งํฉ์ ์๋ฏธํจ
=> f(n)์ด ์ํ (upper bound)
T(n)์ด O(f(n)) ์ ์ํ๋์ง ์ฆ๋ช ํ๋ ค๋ฉด?
T(n) <= c · f(n) for all n >= n0 ๋ฅผ ๋ง์กฑํ๋ c์ n0์ ์ฐพ์ผ๋ฉด ๋จ!
=> T(n)์ ์ ๋ ฅ๊ฐ์ด ์๋ฌด๋ฆฌ ์ฆ๊ฐํ๋๋ผ๋ ์ํ์ธ f(n)๊ณผ ๋น์ทํ ์์์ผ๋ก ์ฆ๊ฐํ๋ ํํ๋ฅผ ๋ ๊ฒ ๋จ
T(n) = 4n - 4 ∈ O(n), O(n^2), O(n^3) ... ์
=> ๊ฐ์ฅ tightํ bound๋ฅผ ์ฐพ๋ ๊ฒ์ด ์ค์ํจ!
์ฑ๋ฅ ํ๊ฐ์ ์ค์ํ ์ํฅ์ ๋ฏธ์น์ง ์๋ ๊ณ์, ์์ํญ ๊ตณ์ด ์ ๊ฒฝ ์ฐ์ง X
2n + 1 ∈ O(1/2n)
O(n) = O(2n) = O(n +2)
- Big-Omega Notation
=> n์ด ์์ฃผ ํด ๋ c · f(n) ๋ณด๋ค ๊ฐ์ด ํฐ ํจ์์ ์งํฉ
=> f(n)์ด ํํ (lower bound)
T(n)์ด Ω(f(n)) ์ ์ํ๋์ง ์ฆ๋ช ํ๋ ค๋ฉด?
T(n) >= c · f(n) for all n >= n0 ๋ฅผ ๋ง์กฑํ๋ c์ n0์ ์ฐพ์ผ๋ฉด ๋จ!
=> T(n)์ ์ ๋ ฅ๊ฐ์ด ์๋ฌด๋ฆฌ ์ฆ๊ฐํ๋๋ผ๋ ํํ์ธ f(n)๊ณผ ๋น์ทํ ์์์ผ๋ก ์ฆ๊ฐํ๋ ํํ๋ฅผ ๋ ๊ฒ ๋จ
- Big-Theta Notation
=> ์ํ๊ณผ ํํ์ด ๋ชจ๋ f(n)์ธ ํจ์ ์งํฉ
T(n)์ด Θ(f(n))์ ์ํ๋์ง ์ฆ๋ช ํ๋ ค๋ฉด?
T(n)์ด O(f(n)) ๊ณผ Ω(f(n)) ๋ชจ๋์ ์ํ๋์ง ์ฆ๋ช ํ๋ฉด ๋จ!
Simplifying Rules
'๐ฅ Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
L05 - Heapsort (2) | 2024.10.06 |
---|---|
L04 - Merge Sort & Quicksort (2) | 2024.09.27 |
L03 - Basic Sorting Algorithms (1) | 2024.09.25 |
L02 - Recurrences (1) | 2024.09.17 |
์๊ฐ๋ณต์ก๋์ ๋๋ฒ๊น (3) | 2024.01.17 |