์๊ฐ ๋ณต์ก๋๋ฅผ ๊ณ ๋ คํ ํ์ด? ๐ค
- ์ฝ๋ฉ ํ ์คํธ ๋ฌธ์ ๋ฅผ ์ฒ์ ํ์์ ๋ ๋ฌธ์ ๋ฅผ ํ๊ธฐ์ ๊ธ๊ธํ์ง๋ง ๋ง์ ํ ์คํธ์ ํต๊ณผํ๊ณ ๋ ํ ์ด ์ฝ๋๊ฐ ๋ง๋? ์ด๊ฒ ํจ์จ์ ์ธ๊ฐ?๋ผ๋ ์๊ฐ์ ํด๋ณธ ์ ์ด ์๋ค๋ฉด ์ด๋ฏธ ์๊ฐ ๋ณต์ก๋์ ๋ํด ๊ณ ๋ฏผํด ๋ณธ ๊ฒ์ด๋ ๋ค๋ฆ์๋ค!
- ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ณ ๋ คํ๋ค๋ ๊ฑด ์ ๋ ฅ๊ฐ์ ๋ฐ๋ผ ๋ก์ง์ด ์คํ๋๋ ์๊ฐ์ด ์ฆ๊ฐํ๊ณ ๊ฐ์ํ๋ ์๊ฐ์ ๋น์จ์ ์ต์ํํ์ฌ ๊ตฌ์ฑํ๋ค๋ ๋ป์ด๋ค.
- ์๊ฐ ๋ณต์ก๋๋ 3๊ฐ์ง์ ํ๊ธฐ๋ฒ์ด ์๋๋ฐ
- Big-O(๋น -์ค) -> ์ต์ ์ ๊ณ ๋ ค ( ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ต๋๋ฅผ ๊ณ ๋ ค )
- Big-Ω(๋น -์ค๋ฉ๊ฐ) -> ์ต์ ์ ๊ณ ๋ ค ( ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ต์ ์ ๊ณ ๋ ค )
- Big-θ(๋น -์ธํ) -> ํ๊ท ์ ๊ณ ๋ ค ( ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ํ๊ท ์ ๊ณ ๋ ค )
- ์๊ฐ ๋ณต์ก๋์์ ๊ฐ์ฅ ์์ฃผ ์ฌ์ฉ๋๋ ํ๊ธฐ๋ฒ์ ๋น ์ค ํ๊ธฐ๋ฒ์ผ๋ก ์ต์ ์ ๊ณ ๋ คํด์ผ ํ๋ค. ์ฆ ํจ์จ์ ๊ณ ๋ คํ ๋ ์ ๋ ฅ๊ฐ์ ๋ฐ๋ผ ์ต๋ ~~ ๊น์ง ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์๋ค๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค.
- ๋น ์ค ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ ์ด์ ๋ ๋น -์ค๋ฉ๊ฐ ์ฒ๋ผ ์ต์ ์ ๊ณ ๋ คํ ๊ฒฝ์ฐ 10์ด๊ฐ ๋์์ด์ผ ํ๋ ๊ฒ 50์ด๊ฐ ๋์ค๊ฒ ๋๋ฉด ํด๋น ๋ฌธ์ ์ ๋ํด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ตฌ๊ฐ์ ์ฐพ์ ํด๊ฒฐํ๊ธฐ ์ํ ์๊ฐ์ด ๋ง์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค. ์ ์ด์ ๋ก ๋น -์ธํ ๋ํ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
Big-O ํ๊ธฐ๋ฒ์ ์ข ๋ฅ
- O(1) (constant complexity) ์ผ์ ํ ๋ณต์ก๋
- ๊ฐ์ฅ ๋น ๋ฅธ ์๊ฐ๋ณต์ก๋๋ก ์ ๋ ฅ๊ฐ์ ํฌ๊ธฐ์ ์๊ด์์ด ์ฆ์ ์ถ๋ ฅ ๊ฐ์ ์ป์ด๋ธ๋ค.
const arr = [1, 2, 3];
const testFn = (arr) => {
return arr[1];
};
test(arr); // 2
- ์ด๋ค ๋ฐฐ์ด์ด ๋ค์ด๊ฐ๋ 1๋ฒ์งธ index๊ฐ์ ๋ฑ์ด๋ด๋ ์ด ํจ์์ ์๊ฐ ๋ณต์ก๋๋ (O)1 ์ด๋ค.
- arr๋ฐฐ์ด์ ์์๊ฐ 10000๊ฐ ์์ด๋ ์ฆ์ ๊ฐ์ ๋ฐํํ๋ค.
- O(log n) (logarithmic complexity) ๋ก๊ทธ ๋ณต์ก๋
- O(1) ๋ค์์ผ๋ก ๋น ๋ฅธ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
- ๋ํ์ ์ผ๋ก ์ด์ง ํ์(Binary Search Algorithm)์ด ํด๋น ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
- ์ดํดํ๊ธฐ ์ฌ์ด ๊ฒ์์ผ๋ก ๋น์ ํด ๋ณด์๋ฉด up & down์ ์๋ก ๋ค ์ ์๋ค.
- 1~50 ์ค ํ๋์ ์ซ์๋ฅผ ๊ณ ๋ฅธ๋ค. (20)
- 25(๊ฐ์ด๋ฐ) ์ซ์๋ฅผ ์ ์ํ๋ฉด 20๋ณด๋ค ํผ์ผ๋ก down์ ์ธ์น๋ค.
- 1~25์ค์ ํ๋์ ์ซ์์ด๋ฏ๋ก ๋๋ค์ ๊ฒฝ์ฐ์ ์๋ฅผ ์ ๋ฐ์ผ๋ก ์ค์ด๊ธฐ ์ํด 12๋ฅผ ์ ์ํ๋ค.
- 12๋ณด๋ค ํฌ๋ฏ๋ก up์ ์ธ์น๋ค.
- ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ์ ์ ๋ฐ์ผ๋ก ์ค์ฌ๋๊ฐ๋ฉฐ ์ ๋ต์ ์ฐพ๋๋ค
- O(n) (linear complexity) ์ ํ ๋ณต์ก๋
- ์ ๋ ฅ๊ฐ์ด 1์ผ ๋ 1์ด, 100์ผ ๋ 100์ด๊ฐ ๊ฑธ๋ฆฐ๋ค๋ฉด ๊ทธ๊ฑด O(n)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค๊ณ ํ ์ ์๋ค.
const testFn = (n) => {
for (let i = 0; i < n; i++) {
console.log(i);
}
};
const testFn2 = (n) => {
for (let i = 0; i < 2n; i++) {
console.log(i);
}
for (let j = 0; j < n; j++) {
console.log(j);
}
};
// testFn[O(n)] ๊ณผ testFn2[O(2n)] ์ ์๊ฐ๋ณต์ก๋๋ ๊ฐ๋ค.
- ๊ฐ๋จํ๊ฒ for๋ฌธ, filter, map ๋ฑ์ด O(n)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค. ์
๋ ฅ๊ฐ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์๊ฐ์ด ๊ฐ์ ๋น์จ๋ก ์ฆ๊ฐํ๋ค.
- testFn2 ํจ์๋ 2๊ฐ์ for๋ฌธ์ผ๋ก O(2n)์ด๋ผ๊ณ ์๊ฐํ ์๋ ์์ง๋ง, Big-O ํ๊ธฐ๋ฒ์์๋ ๋ชจ๋ ๋ค O(n)์ด๋ผ๊ณ ํํํ๋ค.
- O(n log n) (linearithmic time) ๋ก๊ทธ ์ ํ ์๊ณ ๋ฆฌ์ฆ
- ์ ํ(linear) ์๊ณ ๋ฆฌ์ฆ ๋ณด๋ค ์ฝ๊ฐ ๋๋ฆฌ๊ณ ๋ํ์ ์ผ๋ก ๋ณํฉ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด ์๋ค.
- O(n^2) (quandratic complexity) 2์ฐจ ๋ณต์ก๋
- ์ ๋ ฅ๊ฐ์ด 1์ผ ๋ 1์ด๊ฐ ๊ฑธ๋ฆฌ๋ ์ฝ๋์ 5๋ฅผ ์คฌ์ ๋ 25์ด๊ฐ ๊ฑธ๋ฆฌ๊ฒ ๋๋ค๋ฉด ์ด ์ฝ๋๋ O(n^2)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค๊ณ ํ ์ ์๋ค.
const testFn = (n) => {
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
//๋ด์ฉ
}
}
};
const testFn2 = (n) => {
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
for (let k = 0; k < n; k++) {
//๋ด์ฉ
}
}
}
};
// testFn[O(n^2)] ๊ณผ testFn2[O(n^3)] ์ ์๊ฐ๋ณต์ก๋๋ ๊ฐ๋ค.
- 2์ค, 3์ค for๋ฌธ์ด O(n^2)์ ํด๋นํ๋ค. O(n)์ ์๊ฐ ๋ณต์ก๋์ ๋ง์ฐฌ๊ฐ์ง๋ก O(n^2)์ด๋ O(n^3) ์ด๋ O(n^2)๋ก ํ๊ธฐํ๋ค.
- O(2^n) (exponentialcomplexity) ๊ธฐํ๊ธ์์ ๋ณต์ก๋
- Big-O ํ๊ธฐ๋ฒ ์ค ๊ฐ์ฅ ๋๋ฆฐ ์๊ฐ ๋ณต์ก๋๋ค. ๋ด๊ฐ ๊ตฌํํ ์๊ณ ๋ฆฌ์ฆ์ด ์ด ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค๋ฉด ๋ค์ ํ๋ฒ ๊ณ ๋ฏผํด๋ณด์.
- ํด๋น ์๊ฐ ๋ณต์ก๋๋ ์ฌ๊ท ํจ์, ํผ๋ณด๋์น์์ด๊ณผ ๊ด๋ จ์ด ์๋๋ฐ ์์ง ๊ณต๋ถ๋ฅผ ๋ชปํ๊ธฐ์ ๋์ค์ ์ถ๊ฐํ ์์ ์ด๋ค.
'์๊ณ ๋ฆฌ์ฆ & ๋ฌธ์ ํ์ด > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ ํด๋ฆฌ๋ ํธ์ ๋ฒ (Euclidean algorithm) (0) | 2022.09.28 |
---|---|
ํ์ ์๊ณ ๋ฆฌ์ฆ(Greedy Algorithm) (0) | 2022.09.06 |
์๋ผํ ์คํ ๋ค์ค์ ์ฒด (0) | 2022.09.04 |