๐ผ ์๊ฐ๋ณต์ก๋
์๊ณ ๋ฆฌ์ฆ์ ๋ก์ง์ ์ฝ๋๋ก ๊ตฌํํ ๋, ์๊ฐ๋ณต์ก๋๋ฅผ ๊ณ ๋ คํ๋ค๋ ๊ฒ์
'์ ๋ ฅ๊ฐ์ ๋ณํ์ ๋ฐ๋ผ ์ฐ์ฐ์ ์คํํ ๋, ์ฐ์ฐ ํ์์ ๋นํด ์๊ฐ์ด ์ผ๋ง๋งํผ ๊ฑธ๋ฆฌ๋๊ฐ?'๋ผ๋ ๋ง์ด๋ค.
ํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๋ค๋ ๊ฒ์ ์ ๋ ฅ๊ฐ์ด ์ปค์ง์ ๋ฐ๋ผ ์ฆ๊ฐํ๋ ์๊ฐ์ ๋น์จ์ ์ต์ํํ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌ์ฑํ๋ ๊ฒ์ด๋ค.
์๊ฐ ๋ณต์ก๋๋ Big-o ํ๊ธฐ๋ฒ์ ์ฌ์ฉํด ๋ํ๋ธ๋ค.
๐ผ Big-o ํ๊ธฐ๋ฒ
์๊ฐ๋ณต์ก๋๋ฅผ ํ๊ธฐํ๋ ๋ฐฉ๋ฒ
- Big-O(๋น -์ค) ⇒ ์ํ ์ ๊ทผ (์ต์ ์ ๊ฒฝ์ฐ)
- Big-Ω(๋น -์ค๋ฉ๊ฐ) ⇒ ํํ ์ ๊ทผ (์ต์ ์ ๊ฒฝ์ฐ)
- Big-θ(๋น -์ธํ) ⇒ ๊ทธ ๋์ ํ๊ท (ํ๊ท ์ ๊ฒฝ์ฐ)
- ์ ์ธ ๊ฐ์ง ํ๊ธฐ๋ฒ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ๊ฐ ์ต์ , ์ต์ , ์ค๊ฐ(ํ๊ท )์ ๊ฒฝ์ฐ์ ๋ํ์ฌ ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด ์ค์์ Big-O ํ๊ธฐ๋ฒ์ด ๊ฐ์ฅ ์์ฃผ ์ฌ์ฉ๋๋ฉฐ, ๋น ์ค ํ๊ธฐ๋ฒ์ ์ต์ ์ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ๋ฏ๋ก, ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๊ณผ์ ์์ ์์๋๋ ์ต์ ์ ์๊ฐ๊น์ง ๊ณ ๋ คํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
"์ต์ํ ํน์ ์๊ฐ ์ด์์ด ๊ฑธ๋ฆฐ๋ค" ํน์ "์ด ์ ๋ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค"๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ๋ณด๋ค "์ด ์ ๋ ์๊ฐ๊น์ง ๊ฑธ๋ฆด ์ ์๋ค"๋ฅผ ๊ณ ๋ คํด์ผ ๊ทธ์ ๋ง๋ ๋์์ด ๊ฐ๋ฅํ๋ค.
์ต์ ์ ๊ฒฝ์ฐ๋ ๊ณ ๋ คํ์ฌ ๋๋นํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
๐ผ Big-O ํ๊ธฐ๋ฒ์ ์ข ๋ฅ
- O(1) : ์์ ์๊ฐ ์๊ณ ๋ฆฌ์ฆ
- O(n) : ์ ํ ์๊ฐ ์๊ณ ๋ฆฌ์ฆ
- O(log n) : ๋ก๊ทธ ์๊ฐ ์๊ณ ๋ฆฌ์ฆ
- O(n2) : ํ๋ฐฉ ์๊ฐ ์๊ณ ๋ฆฌ์ฆ
- O(2n) : ์ง์ ์๊ฐ
โป ์ฐธ๊ณ ์๊ฐ๋ณต์ก๋ ์ฐ์ฐ ํฌ๊ธฐ ์์
- O(1) < O(log n) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(∞)
O(1)๋ ์ผ์ ํ ๋ณต์ก๋(constant complexity)๋ผ๊ณ ํ๋ฉฐ, ์ ๋ ฅ๊ฐ์ด ์ฆ๊ฐํ๋๋ผ๋ ์๊ฐ์ด ๋์ด๋์ง ์๋๋ค.
- ์ ๋ ฅ๊ฐ์ ํฌ๊ธฐ์ ๊ด๊ณ์์ด, ์ฆ์ ์ถ๋ ฅ๊ฐ์ ์ป์ด๋ผ ์ ์๋ค๋ ์๋ฏธ์ด๋ค.
function O_1_algorithm(arr, index) {
return arr[index];
}
let arr = [1, 2, 3, 4, 5];
let index = 1;
let result = O_1_algorithm(arr, index);
console.log(result); // 2
[์ฝ๋] O(1)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ ์๊ณ ๋ฆฌ์ฆ ์์
์ ์๊ณ ๋ฆฌ์ฆ์์ ์ ๋ ฅ๊ฐ์ ํฌ๊ธฐ๊ฐ ์๋ฌด๋ฆฌ ์ปค์ ธ๋ ์ฆ์ ์ถ๋ ฅ๊ฐ์ ์ป์ด๋ผ ์ ์๋ค. ์๋ฅผ ๋ค์ด arr์ ๊ธธ์ด๊ฐ 100๋ง์ด๋ผ๋, ์ฆ์ ํด๋น index์ ์ ๊ทผํด ๊ฐ์ ๋ฐํํ ์ ์๋ค.
O(n)์ ์ ํ ๋ณต์ก๋(linear complexity)๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ์ ๋ ฅ๊ฐ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์๊ฐ ๋ํ ๊ฐ์ ๋น์จ๋ก ์ฆ๊ฐํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
- ์๋ฅผ ๋ค์ด ์ ๋ ฅ๊ฐ์ด 1์ผ ๋ 1์ด์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ณ , ์ ๋ ฅ๊ฐ์ 100๋ฐฐ๋ก ์ฆ๊ฐ์์ผฐ์ ๋ 1์ด์ 100๋ฐฐ์ธ 100์ด๊ฐ ๊ฑธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๋ค๋ฉด, ๊ทธ ์๊ณ ๋ฆฌ์ฆ์ O(n)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค๊ณ ํ ์ ์๋ค.
function O_n_algorithm(n) {
for (let i = 0; i < n; i++) {
// do something for 1 second
}
}
function another_O_n_algorithm(n) {
for (let i = 0; i < 2n; i++) {
// do something for 1 second
}
}
O_n_algorithm ํจ์์์ ์ ๋ ฅ๊ฐ(n)์ด 1 ์ฆ๊ฐํ ๋๋ง๋ค ์ฝ๋์ ์คํ ์๊ฐ์ด 1์ด์ฉ ์ฆ๊ฐํ๋ค.
์ฆ ์ ๋ ฅ๊ฐ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๊ฐ์ ๋น์จ๋ก ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ๋์ด๋๊ณ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ํจ์ another_O_n_algorithm ์ ์ ๋ ฅ๊ฐ์ด 1 ์ฆ๊ฐํ ๋๋ง๋ค ์ฝ๋์ ์คํ ์๊ฐ์ด 2์ด์ฉ ์ฆ๊ฐํ๋ค.
์ด ์๊ณ ๋ฆฌ์ฆ ๋ํ Big-O ํ๊ธฐ๋ฒ์ผ๋ก๋ O(n)์ผ๋ก ํ๊ธฐํ๋ค.
์ ๋ ฅ๊ฐ์ด ์ปค์ง๋ฉด ์ปค์ง์๋ก ๊ณ์(n ์์ ์๋ ์)์ ์๋ฏธ(์ํฅ๋ ฅ)๊ฐ ์ ์ ํด์๋๊ธฐ ๋๋ฌธ์, ๊ฐ์ ๋น์จ๋ก ์ฆ๊ฐํ๊ณ ์๋ค๋ฉด 2๋ฐฐ๊ฐ ์๋ 5๋ฐฐ, 10๋ฐฐ๋ก ์ฆ๊ฐํ๋๋ผ๋ O(n)์ผ๋ก ํ๊ธฐํ๋ค.
O(log n)์ ๋ก๊ทธ ๋ณต์ก๋(logarithmic complexity)๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, Big-Oํ๊ธฐ๋ฒ์ค O(1) ๋ค์์ผ๋ก ๋น ๋ฅธ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
- BST์์ ์ํ๋ ๊ฐ์ ํ์ํ ๋, ๋ ธ๋๋ฅผ ์ด๋ํ ๋๋ง๋ค ๊ฒฝ์ฐ์ ์๊ฐ ์ ๋ฐ์ผ๋ก ์ค์ด๋ ๋ค.
- ๋งค๋ฒ ์ซ์๋ฅผ ์ ์ํ ๋๋ง๋ค ๊ฒฝ์ฐ์ ์๊ฐ ์ ๋ฐ์ด ์ค์ด๋ค๊ธฐ ๋๋ฌธ์ ์ต์ ์ ๊ฒฝ์ฐ์๋ 7๋ฒ์ด๋ฉด ์ํ๋ ์ซ์๋ฅผ ์ฐพ์๋ผ ์ ์๊ฒ ๋๋ค.
- BST์ ๊ฐ ํ์ ๋ํ ์ด์๊ฐ์ ๋ก์ง์ผ๋ก, O(log n)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง ์๊ณ ๋ฆฌ์ฆ(ํ์๊ธฐ๋ฒ)์ด๋ค.
O(log n)์ logarithmic complexity๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ Big-Oํ๊ธฐ๋ฒ์ค O(1) ๋ค์์ผ๋ก ๋น ๋ฅธ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
BST์์ ์ํ๋ ๊ฐ์ ํ์ํ ๋, ๋ ธ๋๋ฅผ ์ด๋ํ ๋๋ง๋ค ๊ฒฝ์ฐ์ ์๊ฐ ์ ๋ฐ์ผ๋ก ์ค์ด๋ ๋ค.
ex) up & down ๊ฒ์
- 1~100 ์ค ํ๋์ ์ซ์๋ฅผ ํ๋ ์ด์ด1์ด ๊ณ ๋ฅธ๋ค (30์ ๊ณจ๋๋ค๊ณ ๊ฐ์ ํฉ๋๋ค).
- 50(๊ฐ์ด๋ฐ) ์ซ์๋ฅผ ์ ์ํ๋ฉด 50๋ณด๋ค ์์ผ๋ฏ๋ก down์ ์ธ์น๋ค.
- 1~50์ค์ ํ๋์ ์ซ์์ด๋ฏ๋ก ๋๋ค์ ๊ฒฝ์ฐ์ ์๋ฅผ ์ ๋ฐ์ผ๋ก ์ค์ด๊ธฐ ์ํด 25๋ฅผ ์ ์ํ๋ค.
- 25๋ณด๋ค ํฌ๋ฏ๋ก up์ ์ธ์น๋ค.
- ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ์ ์ ๋ฐ์ผ๋ก ์ค์ฌ๋๊ฐ๋ฉฐ ์ ๋ต์ ์ฐพ๋๋ค.
๋งค๋ฒ ์ซ์๋ฅผ ์ ์ํ ๋๋ง๋ค ๊ฒฝ์ฐ์ ์๊ฐ ์ ๋ฐ์ด ์ค์ด๋ค๊ธฐ ๋๋ฌธ์ ์ต์ ์ ๊ฒฝ์ฐ์๋ 7๋ฒ์ด๋ฉด ์ํ๋ ์ซ์๋ฅผ ์ฐพ์๋ผ ์ ์๊ฒ ๋๋ค.
BST์ ๊ฐ ํ์๋ ๊ฐ์ ๋ก์ง์ผ๋ก O(log n)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง ์๊ณ ๋ฆฌ์ฆ(ํ์๊ธฐ๋ฒ)์ด๋ค.
O(n2)์ 2์ฐจ ๋ณต์ก๋(quadratic complexity)๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ์ ๋ ฅ๊ฐ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์๊ฐ์ด n์ ์ ๊ณฑ์์ ๋น์จ๋ก ์ฆ๊ฐํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
- ์๋ฅผ ๋ค์ด ์ ๋ ฅ๊ฐ์ด 1์ผ ๊ฒฝ์ฐ 1์ด๊ฐ ๊ฑธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ 5๋ผ๋ ๊ฐ์ ์ฃผ์๋๋ 25์ด๊ฐ ๊ฑธ๋ฆฌ๊ฒ ๋๋ค๋ฉด, ์ด ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๋ O(n2)๋ผ๊ณ ํํํ๋ค.
function O_quadratic_algorithm(n) {
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
// do something for 1 second
}
}
}
function another_O_quadratic_algorithm(n) {
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
for (let k = 0; k < n; k++) {
// do something for 1 second
}
}
}
}
[์ฝ๋] O(n2)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ ์๊ณ ๋ฆฌ์ฆ ์์
2n, 5n ์ ๋ชจ๋ O(n)์ด๋ผ๊ณ ํํํ๋ ๊ฒ์ฒ๋ผ, n3๊ณผ n5 ๋ ๋ชจ๋ O(n2)๋ก ํ๊ธฐํ๋ค.
n์ด ์ปค์ง๋ฉด ์ปค์ง์๋ก ์ง์๊ฐ ์ฃผ๋ ์ํฅ๋ ฅ์ด ์ ์ ํด์๋๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ ํ๊ธฐํ๋ค.
O(2n)์ ๊ธฐํ๊ธ์์ ๋ณต์ก๋(exponential complexity)๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, Big-O ํ๊ธฐ๋ฒ ์ค ๊ฐ์ฅ ๋๋ฆฐ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
- ์ฌ๊ท๋ก ๊ตฌํํ๋ ํผ๋ณด๋์น ์์ด์ O(2n)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง ๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
O(2n)์ exponential complexity๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ Big-O ํ๊ธฐ๋ฒ ์ค ๊ฐ์ฅ ๋๋ฆฐ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ๋ค.
๊ตฌํํ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๊ฐ O(2n)์ด๋ผ๋ฉด ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ๊ณ ๋ฏผํด ๋ณด๋ ๊ฒ์ด ์ข๋ค.
function fibonacci(n) {
if (n <= 1) {
return 1;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
์ฌ๊ท๋ก ๊ตฌํํ๋ ํผ๋ณด๋์น ์์ด์ O(2n)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง ๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ์ฐฝ์์ n์ 40์ผ๋ก ๋์ด๋ ์์ด๊ฐ ๊ฑธ๋ฆฌ๋ ๊ฒ์ ํ์ธํ ์ ์์ผ๋ฉฐ, n์ด 100 ์ด์์ด๋ฉด ํ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ๋ฐ์ง ๋ชปํ ์๋ ์๋ค.
๐ผ ๋ฐ์ดํฐ ํฌ๊ธฐ์ ๋ฐ๋ฅธ ์๊ฐ ๋ณต์ก๋
๋ฐ์ดํฐ ํฌ๊ธฐ ์ ํ์์๋๋์๊ฐ ๋ณต์ก๋
n ≤ 1,000,000 | O(n) or O (logn) |
n ≤ 10,000 | O(n2) |
n ≤ 500 | O(n3) |
๐ผ ์ง์ ์๊ณ ๋ฆฌ์ฆ
๋ฌธ์ ํ ๊ฐ์ง๋ฅผ ํ์์ ์ผ๋ก ์ค์ฌ ๋๊ฐ 2๊ฐ ํน์ ๋ ๋ง์ ๋ถ๋ถ์ ๋ ์์ ์ฌ์ด์ฆ์ ๋ฌธ์ ๋ค๋ก ๋ง๋๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์ง์ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ฒฝ์ฐ๋ ์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉํด์ ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ์ซ์์ ๊ฐ์์ ๋ฐ๋ผ ์ํ์๊ฐ์ด ๋ฌ๋ผ์ง๋ค.
O(2n) ๋๋ O(rn) : ์ง์ ์๊ฐ ์๊ณ ๋ฆฌ์ฆ (exponential time algorithm)
- n์ด ํ๋ ์ฆ๊ฐํ ๋ ๋ง๋ค, ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ๊ทธ์ ๋ณด๋ค 2๋ฐฐ ๋๋ r๋ฐฐ๋ก ๊ฑธ๋ฆฌ๋ ๋งค์ฐ ๋์ ์ฌ๋ก
ใ
O(n!) : ๊ณ์น ์๊ฐ (factorial time algorithm)
- ์ง์ ์๊ฐ ๋ณด๋ค ๋ ๋ง์ด ๊ฑธ๋ฆผ (๋ ๋น ๋ฅด๊ฒ ์ฆ๊ฐํจ)
- ๋ฐ๋ผ์, ์ด ์ง์ ์๊ฐ(super-exponential)์ด๋ผ๊ณ ๋ ํจ
์ฐธ๊ณ ์๋ฃ
'์๋ฃ๊ตฌ์กฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ์ ์๊ณ ๋ฆฌ์ฆ (0) | 2022.07.18 |
---|---|
์์ ํ์ DFS, BFS (0) | 2022.07.11 |
์๋ฃ๊ตฌ์กฐ ์ ๋ ฌ(๋ฒ๋ธ, ์ ํ, ์ฝ์ , ํฉ๋ณ, ํต) (0) | 2022.07.04 |
ํ ์ ๋ ฌ (Heap Sort) (0) | 2022.06.27 |
๋ฐํ(Double-ended Queue) (0) | 2022.06.20 |