โจ ์๊ฐ๋ณต์ก๋
์๊ณ ๋ฆฌ์ฆ์ ๋ก์ง์ ์ฝ๋๋ก ๊ตฌํํ ๋, ์ ๋ ฅ๊ฐ์ ๋ฐ๋ผ ์ถ๋ ฅ๊ฐ์ ๋ด๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋น์จ์ ์๋ฏธํ๋ค.
์๊ฐ ๋ณต์ก๋๋ ๋ณดํต Big-O Notation (Big-O ํ๊ธฐ๋ฒ) ์ ํ์ฉํ์ฌ ๋ํ๋ธ๋ค.
Big-O Notation ์ด์ธ์๋ Big-Omega(big-Ω),Big-Theta(big-Θ) Notation ๋ฑ์ด ์กด์ฌํ๋ค.
Big-Omega๋ ์๊ณ ๋ฆฌ์ฆ ํจ์จ์ ํํ์ ์ ๊ธฐ์ค์ผ๋ก ํ๊ณ , Big-Theta๋ ์ํ์ ๊ณผ ํํ์ ์ ์ฌ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋จํ๋ค.
์ด์ ๋นํด Big-O ๋ ์๊ณ ๋ฆฌ์ฆ ํจ์จ์ ์ํ์ ๊ธฐ์ค์ผ๋ก ํ๊ธฐํ๊ธฐ ๋๋ฌธ์ ์์ฃผ ์ฌ์ฉ๋๋ค.
์ฆ, ์๊ณ ๋ฆฌ์ฆ์ ์คํํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ต๋๊ฐ์ ํ๊ธฐํ๊ธฐ ๋๋ฌธ์ ํจ์จ์ฑ ์ ๊ฒ์ ์์ฃผ ์ฌ์ฉ๋๋ค.
์๊ฐ ๋ณต์ก๋์ ์์ธ๋ฌ ๊ณต๊ฐ ๋ณต์ก๋ (Space Complexity) ๊ฐ ์์ฃผ ๋ ผ์๋๊ณค ํ๋๋ฐ,
์ด๋ ๊ธฐ์ต ์์ญ๊ณผ ํ์ผ ๊ณต๊ฐ์ด ์ผ๋ง๋ ํ์ํ๊ฐ๋ฅผ ํ๊ฐํ ๊ฒ์ด๋ค.
โจ Big-O Notation
๋ฐ์ดํฐ์ ๊ฐ์์ ๋ฐ๋ผ ์ํ์๊ฐ์ด ์ฆ๊ฐํ๋ ๋น์จ์ ํํํ๋ ๊ธฐ๋ฒ์ด๋ค. (์ด๋ฌํ ํน์ง์ ์ ๊ทผ์ ๋ถ์์ด๋ผ ํ๋ค.)
์คํ ์๊ฐ์ ์ง์ ์ธก์ ํ์ฌ ํ๊ธฐํ๋ค๊ธฐ๋ณด๋ค, ์ ๋ ฅ ๋ฐ์ดํฐ์ ๋ฐ๋ฅธ ์ฐ์ฐ์ ์คํ ํ์๋ฅผ ํํํ ๊ฒ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
โจ Big-O Notation์ ํน์ง
1. ์์ํญ์ ๋ฌด์ํ๋ค.
์์๋ ๋ณํ์ง ์๋ ์ผ์ ํ ๊ฐ์ ๊ฐ๋ ์ซ์๋ฅผ ์๋ฏธํ๋ค.
๊ฐ๋ น, 2N ์์ 2๋ ๊ณ ์ ๋ ๊ฐ์ด๋ฏ๋ก ์์์ด๋ฉฐ N์ ๋ณํ๋ ๊ฐ์ด๋ฏ๋ก ๋ณ์์ด๋ค.
Big-O ๋ฅผ ์๋ฐํ ๋ฐ์ง๋ฉด ์์๊ฐ ๋ถ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋, ์๊ฐ๋ณต์ก๋ ์์ฒด๋ ์ ๋ ฅ๊ฐ์ธ N์ ๋ฐ๋ผ ๋ณํ๊ธฐ ๋๋ฌธ์ ์๋ตํ๋ค.
Ex: O(2N) -> N
2. ์ํฅ๋ น์ด ์๋ ํญ์ ๋ฌด์ํ๋ค.
์์ ๊ฐ์ ์ด์ ๋ก ๊ฐ์ฅ ์ํฅ๋ ฅ์ด ํฐ ํญ ์ด์ธ์ ๋ถ์์ ์ธ ํญ๋ค์ ์๋ตํ๋ค.
Ex: O(N^2 + N + 1) -> O(N^2)
โจ ์ฃผ์ ์ฑ๋ฅ
- ์๊ฐ ๋ณต์ก๋์ ์๋๋ฅผ ํ ๋ฒ์ ๋น๊ตํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- O(1) < O(log N) < O(N) < (O N log N) < O(N^2) < O(2^N)
- ์๋๊ฐ ๋น ๋ฅผ์๋ก ํจ์จ์ฑ์ด ๋์์ง๋ฉฐ, ์ฑ๋ฅ์ด ์ข์์ง๋ค. ๋ฐ๋ผ์ ์์ ์ฑ๋ฅ ๋น๊ต์์ O(1) ์ด ๊ฐ์ฅ ํจ์จ์ฑ์ด ๋์ผ๋ฉฐ, O(2^N) ์ด ๊ฐ์ฅ ๋ฎ๋ค.
1. O(1) Constant
- Case: ์คํ์ Push, pop ๋ฉ์๋
- ์ ๋ ฅ๊ฐ (N) ์ด ์ฆ๊ฐํด๋ ์คํ์๊ฐ์ ์ธ์ ๋ ๋์ผํ๋ค. ์ฆ, N์ ๊ด๊ณ์์ด ์์ ์๊ฐ์ด ์์๋๋ค.
Constant(num) {
return num/2;
}
2. O(log N) logarithmic
- Case: ์ด์งํธ๋ฆฌ
- ์ฐ์ฐ์ด ํ ๋ฒ ์คํ๋ ๋๋ง๋ค ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ์ ๋ฐ ๊ฐ์ํ๋ค. (์ด ๋ log ์ ์ง์๋ 2 ์ด๋ค.)
logarithmic(arr, target) {
let left = 0;
let right = arr.length-1;
while(left <= right){
let middle = (left+right)/2;
if(arr[middle] === target) return true;
else if(arr[middle] > target) left = middle+1;
else right = middle-1;
}
return false;
}
3. O(N) linear
- Case: For ๋ฐ๋ณต๋ฌธ
- ์ ๋ ฅ๊ฐ (N) ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์คํ์๊ฐ ์ญ์ ์ ํ์ ์ผ๋ก(linearly) ์ฆ๊ฐํ๋ค.
Linear(arr, target) {
for (let i=0; i<arr.length; i++){
if(arr[i] === target) return true;
}
}
- ์์ ๊ฒฝ์ฐ, target ์ด ๋ฐ๋ณต๋ฌธ ์ด๋ฐ์ ๋ฐ๊ฒฌ๋๋ค๋ฉด ํจ์๊ฐ ์ผ์ฐ ์ข ๋ฃ๋์ด ์๊ฐ ๋ณต์ก๋๊ฐ O(N) ์ ๋ชป ๋ฏธ์น๊ฒ ์ง๋ง, ์ต์ ์ ๊ฒฝ์ฐ target ์ด arr ์ ๋์ ์์นํ์ฌ ๊ฒฐ๊ตญ ์ ๋ ฅ ๊ฐ๋งํผ ์ฐ์ฐ์ด ์คํ๋๋ค. ๋ฐ๋ผ์ ํด๋น ์๊ณ ๋ฆฌ์ฆ์ O(N)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค๊ณ ๋ณผ ์ ์๋ค.
4. O(N log N) linearithmic
- Case: ํต/๋ณํฉ/ํ ์ ๋ ฌ
- Code Example: Merge Sort in JavaScript. Time Complexity O(nlogn)
5. O(N^2) Quadratic
- Case: ์ด์ค For ๋ฐ๋ณต๋ฌธ, ์ฝ์ /๊ฑฐํ/์ ํ ์ ๋ ฌ
Quadratic(num){
for(let i=1; i<num; i++){
for(let j=1; j<num; j++){
console.log(i*j)
}
}
}
- ์์ ๊ฒฝ์ฐ, N์ด ์ ๋ ฅ๋ ๊ฒฝ์ฐ ์ฒซ ๋ฒ์งธ for ๋ฌธ (N) * ๋ ๋ฒ์งธ for ๋ฌธ (N) ๋งํผ ์ฐ์ฐ์ด ์ด๋ฃจ์ด์ง๋ค.
6. O(2^N) Exponential
- Case: Fibonacci ์์ด
Exponential(num) {
if (num <= 1) return 1;
return fibonacci(num - 1) + fibonacci(num - 2);
}
โจ ๋ง๋ฌด๋ฆฌ
์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ ๋ ๋ช ๊ฐ์ง ์ง๋ฌธ์ ๋ ๊ณ ๋ คํ๋ฉฐ ์ค๊ณํ๋ฉด ์ข๋ค.
1. ํด๋น ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ๋ณต์ก๋๋ ๋ฌด์์ธ๊ฐ?
2. ํด๋น ์๊ณ ๋ฆฌ์ฆ์ ๋ฐํ์(์คํ ์๊ฐ)์ ์ด๋ป๊ฒ ์ฆ๊ฐํ๋๊ฐ?
์๊ฐ๋ณต์ก๋๋ฅผ ํ์ ํ๊ธฐ ์ํด์๋ ํจ์ ๋ด๋ถ์์ ์ ๋ ฅ๊ฐ์ ์ด๋ป๊ฒ ์ ๊ทผํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ ๋ ฅ๊ฐ์ด ์ฆ๊ฐํ๋ฉด ํจ์ ์๋์ด ์ด๋ป๊ฒ ๋ฐ๋๋์ง ํ์ ํด์ผ ํ๋ค. ์ด๋ฅผ ์ํด ํด๋น ํจ์๊ฐ ์คํ๋์์ ๋, "์ต์ ์ ๊ฒฝ์ฐ" ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง ์๊ฐํด๋ณด๋ฉด ์ฝ๋ค.
โจ์ฐธ๊ณ ์๋ฃ
'๐ป DEV > Algorithms & Data Structure' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ][C++] ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ (0) | 2024.03.13 |
---|---|
[์๊ณ ๋ฆฌ์ฆ][C++] ์ฐ์ ์์ํ, ํํ (0) | 2024.03.11 |
[์๊ณ ๋ฆฌ์ฆ][C++] Dijkstra (๋ค์ต์คํธ๋ผ) / ์ต๋จ ๊ฒฝ๋ก ํ์ (0) | 2024.03.11 |
[Data Structure] ์คํ(Stack) ๊ณผ ํ(Queue) (0) | 2021.07.07 |
[Algorithm] ๊น์ด์ฐ์ ํ์(DFS) ๊ณผ ๋๋น์ฐ์ ํ์(BFS) (0) | 2021.06.30 |
๋๊ธ