[Algorithm] ๋ถํ ์ ๋ณต / ๋ณํฉ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
๋ถํ ์ ๋ณต (Devide & Conquer)
๊ฐ๋
๋ถํ ์ ๋ณต์ “ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋จ์๋ก ์ชผ๊ฐ๋ฉด์ ํด๊ฒฐํด๋๊ฐ๋ ๋ฐฉ์"์ด๋ค. ๋ฏธ๊ตญ ์ํ์ ํฐ๋ ธ์ด๋ง์ด 1945๋ ์ ๊ฐ๋ฐํ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ํต์ํธ, ๋ณํฉ ์ ๋ ฌ์ด ๋ถํ ์ ๋ณต ๋ฐฉ๋ฒ์ ํตํด ๊ตฌํํ๋ค.
์์ ์ ํ ์ดํ๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค. ํ ์ดํ ๋๋ผ์ด๋ธ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ ํญ์ ์ฒ์๋ถํฐ ์์ฐจ์ ์ผ๋ก ์ฝ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๊ธฐ ์ด๋ ค์ ๋ค. ์ด๋ฐ ํ ์ดํ ๋๋ผ์ด๋ธ์ ๋ฌธ์ ์ ์ ๊ทน๋ณตํ๊ธฐ ์ํด ๋ณํฉ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด ํ์ํ๋ค.
- ๋ถํ : ๋ฌธ์ ๋ฅผ ๋ ์ด์ ๋ถํ ํ ์ ์์ ๋๊น์ง ๋์ผ ์ ํ์ ์ฌ๋ฌ ํ์ ๋ฌธ์ ๋ก ๋๋๋ค
- ์ ๋ณต : ๊ฐ์ฅ ์์ ๋จ์์ ํ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉฐ ์ ๋ณตํ๋ค
- ์กฐํฉ : ํ์ ๋ฌธ์ ์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ์๋ ๋ฌธ์ ์ ๋ํ ๊ฒฐ๊ณผ๋ก ์กฐํฉํ๋ค
์์
๋ถํ ์ ๋ณต์ ๊ตฌ์กฐ๋ ๋์ผํ์ง๋ง ๋ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ์์ด ๋ฐ๋ณต๋๋ ์ฌ๊ท๋ผ๊ณ ๋ณผ ์ ์๋ค. 5์ ๊ณ์น(5!
)์ ์ฌ๊ท๋ก ๊ณ์ฐํ๋ factorial ํจ์๊ฐ ์ ํ์ ์ธ ๋ถํ ์ ๋ณต์ ์๋ค. 5์ ๊ณ์น์ 5 × 4 × 3 × 2 × 1
์ ๊ฒฐ๊ณผ์ด๋ฏ๋ก 5
๋ถํฐ -1
์ฉ ๋ฌธ์ ๋ฅผ ์ชผ๊นฌ ํ(๋ถํ ), ๊ฐ์ฅ ์์ ๋จ์์ ํ์ ๋ฌธ์ ์ธ 2 × 1
๋ถํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉฐ(์ ๋ณต/์กฐํฉ) ๊ฒฐ๊ณผ๋ฅผ ๋์ถํ๋ค.
- $5 \times (4 \times 3 \times 2 \times 1) = 5 \times \text{fact}(5-1) = (5 \times 24)$
- $4 \times (3 \times 2 \times 1) = 4 \times \text{fact}(4-1) = (4 \times 6)$
- $3 \times (2 \times 1) = 3 \times \text{fact}(3-1) = (3 \times 2)$
- $2 \times 1 = 2 \times \text{fact}(2-1) = (2 \times 1)$
- $1\,\text{(Base Case)}$
function fac(n) {
// Base Case ์ฌ๊ท๊ฐ ๋ฉ์ถ๋ ์กฐ๊ฑด
if (n === 1) return 1;
// Recursive Case
return n * fac(n - 1);
}
fac(5); // 120
๋ณํฉ ์ ๋ ฌ
์๊ณ ๋ฆฌ์ฆ ๊ฐ๋
๋ณํฉ ์ ๋ ฌ์ 1๊ฐ ๋ฐฐ์ด์ โ2๊ฐ์ ์์ ๋ฐฐ์ด๋ก ๋ถํ ํ์ฌ โ๊ฐ ๋ฐฐ์ด์ ์ ๋ ฌ(์ ๋ณต)ํ ํ โ๋ค์ ๋ณํฉ(๊ฒฐํฉ)ํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉฐ ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ๋ถํ : ์ ๋ ฅ ๋ฐ์ ๋ฐฐ์ด์ ๋์ผ ๊ธธ์ด์ 2๊ฐ ๋ฐฐ์ด๋ก ๋ถํ
- ์ ๋ณต : ๋ถํ ํ ๋ฐฐ์ด ์ ๋ ฌ. ๋ถํ ํ ๋ฐฐ์ด ๊ธธ์ด๊ฐ 2 ์ด์์ด๋ฉด ์ฌ๊ท ํธ์ถ๋ก ๋ถํ ์ ๋ณต ๋ค์ ์ ์ฉ
- ๊ฒฐํฉ : ์ ๋ ฌํ 2๊ฐ์ ๋ฐฐ์ด์ ํ๋์ ๋ฐฐ์ด์ ๋ณํฉ
๊ตฌํ
๐ก ๋ณํฉ ์ ๋ ฌ ๊ตฌํ์ ํฌ๊ฒ ๋ถํ ๋จ๊ณ / ๋ณํฉ ๋จ๊ณ๋ก ๋๋ ์ ์๋ค
์ ํธ ํจ์
const swap = (arr, a, b) => {
/* const temp = arr[a];
arr[a] = arr[b];
arr[b] = temp; */
[arr[a], arr[b]] = [arr[b], arr[a]];
};
const Compare = { LESS_THAN: -1, BIGGER_THAN: 1 };
const defaultCompare = (a, b) => {
if (a === b) return 0;
return a < b ? Compare.LESS_THAN : Compare.BIGGER_THAN;
};
- swap : ๋ฐฐ์ด๊ณผ
a
,b
์ธ๋ฑ์ค๋ฅผ ์ธ์๋ก ๋ฐ์๋ฐฐ์ด[a]
,๋ฐฐ์ด[b]
์์ ์์๋ฅผ ๋ฐ๊พธ๋ ํจ์ - Compare : ๊ฐ ๋น๊ต์ ์ฌ์ฉํ๋ ์์.
- defaultCompare :
a
,b
๊ฐ์ ์ธ์๋ก ๋ฐ์ ์ด๋ ๊ฐ์ด ๋ ํฐ์ง ๋น๊ตํ๋ ํจ์
๋ณํฉ
left
, right
2๊ฐ์ ์ ๋ ฌ๋ ๋ฆฌ์คํธ(๋ฐฐ์ด)๋ฅผ ๋ฐ์ ๋ณํฉํ๋ ํจ์. ๋ ๋ฆฌ์คํธ์ ์์๋ฅผ 0๋ฒ ์ธ๋ฑ์ค๋ถํฐ ๋น๊ตํด์ ๋ ์์ ๊ฐ์ result
๋ฐฐ์ด์ ์ถ๊ฐํ๋ค. left
ํน์ right
์ ๋ชจ๋ ์์๋ฅผ result
๋ฐฐ์ด์ ์ถ๊ฐํ๋ค๋ฉด, ๋จ์ ์์๋ฅผ result
๋ฐฐ์ด์ ์ถ๊ฐํ ํ ์ข
๋ฃํ๋ค.
const merge = (left, right, compare) => {
let i = 0; // left ๋ฆฌ์คํธ ์ธ๋ฑ์ค
let j = 0; // right ๋ฆฌ์คํธ ์ธ๋ฑ์ค
const result = [];
// left ํน์ right์ ๋ชจ๋ ์์๊ฐ result ๋ฐฐ์ด์ ์ถ๊ฐ๋ ๋๊น์ง ๋ฐ๋ณต
while (i < left.length && j < right.length) {
const isLeft = compare(left[i], right[j]) === Compare.LESS_THAN;
result.push(isLeft ? left[i++] : right[j++]);
}
// ๋จ์ ์์๋ฅผ result ๋ฐฐ์ด์ ์ถ๊ฐ
return result.concat(i < left.length ? left.slice(i) : right.slice(j));
};
๋ถํ
๋ฐฐ์ด ๊ธธ์ด๊ฐ 1์ด ๋ ๋๊น์ง ์ ๋ฐ์ฉ(left
, right
) ๋ถํ ํ ํ, merge
ํจ์๋ฅผ ํตํด ๋ถํ ํ ๋ฐฐ์ด์ ์ค๋ฆ์ฐจ์(์์ ์ซ์๋ถํฐ)์ผ๋ก ์ ๋ ฌํ๋ฉด์ ๋ณํฉํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ ํจ์.
const mergeSort = (arr, compare = defaultCompare) => {
if (arr.length > 1) {
// ๋ฐฐ์ด ๊ธธ์ด๊ฐ 1์ด ๋ ๋๊น์ง ๋ฐฐ์ด ๋ถํ
const { length } = arr;
const middle = Math.floor(length / 2); // [๋ถํ ] | [5, 4, 3, 2, 1] -> middle: 2, ...
const left = mergeSort(arr.slice(0, middle)); // [์ ๋ณต] | [5, 4], ...
const right = mergeSort(arr.slice(middle, length)); // [์ ๋ณต] | [3, 2, 1], ...
arr = merge(left, right, compare); // [๊ฒฐํฉ]
}
return arr;
};
๋ถํ / ์ ๋ณต โผ
f([21, 10, 12, 20, 25, 13, 15, 22])
===================================
middle = 4
โด left = f([21, 10, 12, 20]) | [L-1] -> [10, 12, 20, 21]
โพ right = f([25, 13, 15, 22]) | [R-4] -> [13, 15, 22, 25]
ใ arr = merge([10, 12, 20, 21], [13, 15, 22, 25]) | [M-7] -> [10, 12, 13, 15, 20, 21, 22, 25]
---------------------------------------
return [10, 12, 13, 15, 20, 21, 22, 25]
[L-1] f([21, 10, 12, 20])
=========================
middle = 2
โต left = f([21, 10]) | [L-2] -> [10, 21]
โน right = f([12, 20]) | [R-2] -> [12, 20]
โฝ arr = merge([10, 21], [12, 20]) | [M-3] -> [10, 12, 20, 21]
-----------------------
return [10, 12, 20, 21]
[L-2] f([21, 10])
=================
middle = 1
โถ left = f([21]) -> [L-3] -> [21]
โท right = f([10]) -> [R-1] -> [10]
โธ arr = merge([21], [10]) | [M-1] -> [10, 21]
---------------
return [10, 21]
[R-2] f([12, 20])
=================
middle = 1
โบ left = f([12]) -> [L-4] -> [12]
โป right = f([20]) -> [R-3] -> [20]
โผ arr = merge([12], [20]) | [M-2] -> [12, 20]
---------------
return [12, 20]
[R-4] f([25, 13, 15, 22])
=========================
middle = 2
โฟ left = f([25, 13]) | [L-5] -> [13, 25]
โ right = f([15, 22]) | [R-6] -> [15, 22]
โ arr = merge([13, 25], [15, 22]) | [M-6] -> [13, 15, 22, 25]
-----------------------
return [13, 15, 22, 25]
[L-5] f([25, 13])
=================
middle = 1
โ left = f([25]) -> [L-6] -> [25]
โ right = f([13]) -> [R-5] -> [13]
โ arr = merge([25], [13]) | [M-4] -> [13, 25]
---------------
return [13, 25]
[R-6] f([15, 22])
=================
middle = 1
โ left = f([15]) -> [L-7] -> [15]
โ
right = f([22]) -> [R-7] -> [22]
โ arr = merge([15], [22]) -> [M-5] -> [15, 22]
---------------
return [15, 22]
๋ณํฉ โผ
[M-1] merge([21], [10])
=======================
i = 0 / j = 0 -> 21 vs 10 -> [10] | i++
---------------
return [10, 21]
[M-2] merge([12], [20])
=======================
i = 0 / j = 0 -> 12 vs 20 -> [12] | i++
---------------
return [12, 20]
[M-3] merge([10, 21], [12, 20])
===============================
i = 0 / j = 0 -> 10 vs 12 -> [10] | i++
i = 1 / j = 0 -> 21 vs 12 -> [10, 12] | j++
i = 1 / j = 1 -> 21 vs 20 -> [10, 12, 20] | j++
-----------------------
return [10, 12, 20, 21]
[M-4] merge([25], [13])
=======================
i = 0 / j = 0 -> 25 vs 13 -> [13] | j++
---------------
return [13, 25]
[M-5] merge([15], [22])
=======================
i = 0 / j = 0 -> 15 vs 22 -> [15] | i++
---------------
return [15, 22]
[M-6] merge([13, 25], [15, 22])
===============================
i = 0 / j = 0 -> 13 vs 15 -> [13] | i++
i = 1 / j = 0 -> 25 vs 15 -> [13, 15] | j++
i = 1 / j = 1 -> 25 vs 22 -> [13, 15, 22] | j++
-----------------------
return [13, 15, 22, 25]
[M-7] merge([10, 12, 20, 21], [13, 15, 22, 25])
===============================================
i = 0 / j = 0 -> 10 vs 13 -> [10] | i++
i = 1 / j = 0 -> 12 vs 13 -> [10, 12] | i++
i = 2 / j = 0 -> 20 vs 13 -> [10, 12, 13] | j++
i = 2 / j = 1 -> 20 vs 15 -> [10, 12, 13, 15] | j++
i = 2 / j = 2 -> 20 vs 22 -> [10, 12, 13, 15, 20] | i++
i = 3 / j = 2 -> 21 vs 22 -> [10, 12, 13, 15, 20, 21] | i++
---------------------------------------
return [10, 12, 13, 15, 20, 21, 22, 25]
๋ก๊ทธ(Logarithm) ์ฐธ๊ณ ๋ด์ฉ
์๊ฐ ๋ณต์ก๋์์ ๋ก๊ทธ๋ ๋ฐ(base)์ ํ๊ธฐํ์ง ์์ง๋ง, ๋ฐ์ด 2์ธ ๋ก๊ทธ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค(logโN)
.
- ๋ก๊ทธ๋ ์ง์(exponent)์ ์ ๋ฐ๋ ๊ฐ๋
. 2๋ฅผ ๋ช ๋ฒ ๊ฑฐ๋ญ์ ๊ณฑํด์ผ 32๊ฐ ๋์ค๋์ง ๊ณ์ฐํ๋๊ฒ ์ง์, 32๋ 2๋ฅผ ๋ช ๋ฒ ๋๋ ์ผ 1์ด ๋์ค๋์ง ๊ณ์ฐํ๋๊ฒ ๋ก๊ทธ. ์ฐธ๊ณ ๋ก ๋ก๊ทธ๋ ์ง์ ๋ฐฉ์ ์์ผ๋ก ๋ฐ๊ฟ์ ๊ณ์ฐํ๋ฉด ํธํจ(
logโ(b)
→a
๋ฅผ ๋ช ๋ฒ ์ ๊ณฑํด์ผb
๊ฐ ๋์ฌ์ง ๊ณ์ฐํด๋ณธ๋ค).- ์ง์ :
2โฟ = 32
→ 32๋ 2๋ฅผ 5๋ฒ ๊ฑฐ๋ญ์ ๊ณฑํด์ผ ๋์ค๋ฏ๋กn = 5
- ๋ก๊ทธ :
logโ(32) = n
→ 32๋ 2๋ฅผ 5๋ฒ ๋๋ ์ผ 1์ด ๋์ค๋ฏ๋กn = 5
- ์ง์ :
- ์ฆ,
O(logN)
์ ๋ฐ์ดํฐ ์์๊ฐN
๊ฐ ์์ ๋ ์๊ณ ๋ฆฌ์ฆ์ดlogโN
๋จ๊ณ๊ฐ ๊ฑธ๋ฆฐ๋ค๋ ์๋ฏธ. ์์๊ฐ 8๊ฐ๋ผ๋ฉดlogโ8 = 3
์ด๋ฏ๋กO(logN)
์๊ณ ๋ฆฌ์ฆ์ 3๋จ๊ณ๊ฐ ํ์ํ ๊ฒ์ผ๋ก ํด์ํ ์ ์๋ค.
์๊ฐ ๋ณต์ก๋
๋ณํฉ ์ ๋ ฌ์ ํฌ๊ฒ ๋ถํ ๋จ๊ณ์ ๋ณํฉ ๋จ๊ณ๋ก ๋๋ ์ ์๋ค. ๋ถํ ๋จ๊ณ์์ ๋น๊ต / ์ด๋ ์ฐ์ฐ(์์ ๋ฐฐ์ด์ ๋ณต์ฌํ๋ค๊ฐ ๋ค์ ๊ฐ์ ธ์ค๋ ๊ฒ)์ ํ์ง ์์ผ๋ฏ๋ก ์๊ฐ ๋ณต์ก๋์ ํฌํจ๋์ง ์๋๋ค.
- Worst Case(์ ๋ ฌ์ด ์๋์ ๋) :
O(nlogโn)
- Best Case(์ด๋ฏธ ์ ๋ ฌ๋์ ๋) :
O(nlogโn)
๋ณํฉ ๋จ๊ณ์ ์ (์ฌ๊ท ํธ์ถ์ ๊น์ด)
- ๋ ์ฝ๋์ ๊ฐ์
n
์ด 2์ ๊ฑฐ๋ญ์ ๊ณฑn = 2^k
์ด๋ผ๊ณ ๊ฐ์ ํ์ ๋ n = 2^3
์2^3
2^2
2^1
2^0
์์ผ๋ก ์ค์ด๋ค์ด ์ํ ํธ์ถ์ ๊น์ด๊ฐ 3์์ ์ ์ ์๋ค- ์๋ฅผ ํ ๋๋ก
n = 2^k
์ ์ผ๋ฐํํ๋ฉดk(k = logโn)
์์ ์ ์ ์๋ค →k = logโn
$k = logโn$ (๋ฐ์ดํฐ ๊ธธ์ด
n
์ด 8์ด๋ผ๊ณ ๊ฐ์ , 8์ 2๋ฅผ 3๋ฒ ์ ๊ณฑํด์ผ ๋์ค๋ฏ๋ก ์ฌ๊ท ํธ์ถ์ ๊น์ดk
๋ 3)
๋ณํฉ ์ ๋ ฌ ๋ฐ ํต ์ ๋ ฌ์ ๋ฐ์ดํฐ ๊ธธ์ด๊ฐ 1์ด ๋ ๋๊น์ง ์ ๋ฐ์ฉ ๋ถํ ํ๋ค. ๋ฐ์ดํฐ ๊ธธ์ด๊ฐ 8์ด๋ผ๋ฉด 4(8/2)
→ 2(4/2)
→ 1(2/2)
๋ถํ ๊ณผ์ ์ ๊ฑฐ์น๋ฏ๋ก ๊น์ด๋ 3์ด ๋๋ค. [21, 10, 12, 20, 25, 13, 15, 22]
๋ฐฐ์ด์ ์๋ฅผ ๋ค์ด๋ณด๋ฉด…
- 1 depth :
8 / 2 = 4
→n / 2
ํฌ๊ธฐ์ ๋ถ๋ถ ๋ฐฐ์ด 1์ ๋น๊ต (๋ถ๋ถ ๋ฐฐ์ด ๊ฐ์ 2๊ฐ)- (
[21, 10, 12, 20]
— L [25, 13, 15, 22]
)โ — R
- (
- 2 depth :
4 / 2 = 2
→n / 4
ํฌ๊ธฐ์ ๋ถ๋ถ ๋ฐฐ์ด 2์ ๋น๊ต (๋ถ๋ถ ๋ฐฐ์ด ๊ฐ์ 4๊ฐ)- (
[21, 10]
[12, 20]
)โ — L - (
[25, 13]
[15, 22]
)โก — R
- (
- 3 depth :
2 / 2 = 1
→n / 8
ํฌ๊ธฐ์ ๋ถ๋ถ ๋ฐฐ์ด 4์ ๋น๊ต (๋ถ๋ถ ๋ฐฐ์ด ๊ฐ์ 8๊ฐ)- (
[21]
[10]
)โ ([12]
[20]
)โก — L - (
[25]
[13]
)โข ([15]
[22]
)โฃ — R
- (
๋ณํฉ ๋จ๊ณ์ ํฌ๊ธฐ ๋น๊ต ์ฐ์ฐ
๊ฐ ๋ณํฉ ๋จ๊ณ(์ฌ๊ท ํธ์ถ์ ๊น์ด)๋ง๋ค ์ต๋
n
๋ฒ(๋ฐ์ดํฐ ๊ธธ์ด)์ ๋น๊ต ์ฐ์ฐ ์ํ์ ์ํํ๋ค.
์๋๋ [21, 10, 12, 20, 25, 13, 15, 22]
๋ฐฐ์ด์ ๋ํ ์์.
- 3 depth : ๊ธธ์ด๊ฐ 1์ธ(
n/8
) ๋ถ๋ถ ๋ฐฐ์ด 4์ ๋น๊ต- ๊ธธ์ด๊ฐ 1์ธ ๋ถ๋ถ ๋ฐฐ์ด 2๊ฐ(1์) ๋ณํฉ์ ์ต๋ 2๋ฒ(
1×2
)์ ๋น๊ต ์ฐ์ฐ ํ์ - ๊ธธ์ด๊ฐ 1์ธ ๋ถ๋ถ ๋ฐฐ์ด์ด 8๊ฐ(4์)์ด๋ฏ๋ก
4(์)×2(์ฐ์ฐ)=8(๋ฒ)
์ฐ์ฐ ํ์
- ๊ธธ์ด๊ฐ 1์ธ ๋ถ๋ถ ๋ฐฐ์ด 2๊ฐ(1์) ๋ณํฉ์ ์ต๋ 2๋ฒ(
- 2 depth : ๊ธธ์ด๊ฐ 2์ธ(
n/4
) ๋ถ๋ถ ๋ฐฐ์ด 2์ ๋น๊ต- ๊ธธ์ด๊ฐ 2์ธ ๋ถ๋ถ ๋ฐฐ์ด 2๊ฐ(1์) ๋ณํฉ์ ์ต๋ 4๋ฒ(
2×2
)์ ๋น๊ต ์ฐ์ฐ ํ์ - ๊ธธ์ด๊ฐ 2์ธ ๋ถ๋ถ ๋ฐฐ์ด์ด 4๊ฐ(2์)์ด๋ฏ๋ก
2(์)×4(์ฐ์ฐ)=8(๋ฒ)
์ฐ์ฐ ํ์
- ๊ธธ์ด๊ฐ 2์ธ ๋ถ๋ถ ๋ฐฐ์ด 2๊ฐ(1์) ๋ณํฉ์ ์ต๋ 4๋ฒ(
- 1 depth : ๊ธธ์ด๊ฐ 4์ธ(
n/2
) ๋ถ๋ถ ๋ฐฐ์ด 1์ ๋น๊ต- ๊ธธ์ด๊ฐ 4์ธ ๋ถ๋ถ ๋ฐฐ์ด 2๊ฐ(1์) ๋ณํฉ์ ์ต๋ 8๋ฒ(
4×2
)์ ๋น๊ต ์ฐ์ฐ ํ์ - ๊ธธ์ด๊ฐ 4์ธ ๋ถ๋ถ ๋ฐฐ์ด์ด 2๊ฐ(1์)์ด๋ฏ๋ก
1(์)×8(์ฐ์ฐ)=8(๋ฒ)
์ฐ์ฐ ํ์
- ๊ธธ์ด๊ฐ 4์ธ ๋ถ๋ถ ๋ฐฐ์ด 2๊ฐ(1์) ๋ณํฉ์ ์ต๋ 8๋ฒ(
๊ฐ ๋ณํฉ ๋จ๊ณ(depth)๋ง๋ค ์ต๋
n
๋ฒ์ ๋น๊ต ์ฐ์ฐ์ ์ํํ๋ฏ๋ก ์๊ฐ ๋ณต์ก๋๋…๊ฐ ๋ณํฉ ๋จ๊ณ์ ๋น๊ต ์ฐ์ฐ(n) × ๋ณํฉ ๋จ๊ณ์ ์(logโn) = nlogโn
๋ฐ์ดํฐ ๊ธธ์ด๊ฐ 8์ด๋ผ๋ฉด ์ต๋ 24๋ฒ์ ์์ ์ํ
์ฅ๋จ์
Stable ์ ๋ ฌ : ์ค๋ณต ๋ฐ์ดํฐ๋ ์์๋ฅผ ๋ฐ๊พธ์ง ์๋ ๋ฐฉ์(Unstable ์ ๋ ฌ์ ์ค๋ณต ๋ฐ์ดํฐ๋ ์์ ๋ฐ๊ฟ)
In-place ์ ๋ ฌ : ์๋ก์ด ๋ฐฐ์ด ์์ฑ ์์ด ๊ธฐ์กด ๋ฐฐ์ด๋ง ์ฌ์ฉํ๊ฑฐ๋, ์ถฉ๋ถํ ๋ฌด์ํ ๋งํ ์ ์ฅ ๊ณต๊ฐ๋ง ๋ ์ฌ์ฉํ๋ ์ ๋ ฌ ๋ฐฉ์(Not In-place ์ ๋ ฌ์ ์์ ๊ฐ์์ ๋น๋กํ๋ ์ ์ฅ๊ณต๊ฐ์ ๋ ์ฌ์ฉํจ)
- ์ฅ์
- ์ต์ / ์ต์ ๋ชจ๋ ๋์ผํ ์๊ฐ ์์(์ด๋ค ์ ๋ ฅ ๋ฐ์ดํฐ๋ ์ ๋ ฌ ์๊ฐ ๋์ผ / ๋ฐ์ดํฐ ๋ถํฌ ์ํฅ ๋๋ฐ์)
- Stable ์ ๋ ฌ ๋ฐฉ์
- ๋จ์
- In-place ์๊ณ ๋ฆฌ์ฆ์ด ์๋๋ฏ๋ก ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ํ์
- ๋ฐ์ดํฐ ์์ด ๋ง์์ง ์๋ก ์ด๋ ํ์ ๋์ด๋จ → ๋ฌธ์ ํด๊ฒฐ ์๊ฐ ์ฆ๊ฐ
๋ ํผ๋ฐ์ค
- [์๊ณ ๋ฆฌ์ฆ] ํฉ๋ณ ์ ๋ ฌ(merge sort)์ด๋ - Heee's Development Blog
- Common Sorting Algorithms in JavaScript
- ็ฌฌ18็ซ ๆๅบ็ฎๆณ | JavaScript ๆฐๆฎ็ปๆไธ็ฎๆณ
- [JS/Sorting] ๋ณํฉ ์ ๋ ฌ(Merge Sort)๊ณผ ๋ถํ ์ ๋ณต ์ ๋ต(Divide and Conquer) ๊ฐ๋ ์ ๋ํ์ฌ
- ๋ก๊ทธ๋? (๊ฐ๋ ์ดํดํ๊ธฐ) | ๋ก๊ทธ | Khan Academy
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DevTools] 1Password์์ SSH ํค ๊ด๋ฆฌํ๊ธฐ (0) | 2024.05.08 |
---|---|
[Algorithm] ํต ์ ๋ ฌ(Quick Sort) ์๊ณ ๋ฆฌ์ฆ ํบ์๋ณด๊ธฐ (0) | 2024.05.07 |
[Algorithm] ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ณธ (๋ฒ๋ธ/์ ํ/์ฝ์ ) (0) | 2024.05.06 |
[React] ๋ฆฌ์กํธ Suspense ํบ์๋ณด๊ธฐ (0) | 2024.05.06 |
[Git] ์๋ฉด ์ ์ฉํ GitHub ๋จ์ถํค / ํ (0) | 2024.05.05 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[DevTools] 1Password์์ SSH ํค ๊ด๋ฆฌํ๊ธฐ
[DevTools] 1Password์์ SSH ํค ๊ด๋ฆฌํ๊ธฐ
2024.05.08 -
[Algorithm] ํต ์ ๋ ฌ(Quick Sort) ์๊ณ ๋ฆฌ์ฆ ํบ์๋ณด๊ธฐ
[Algorithm] ํต ์ ๋ ฌ(Quick Sort) ์๊ณ ๋ฆฌ์ฆ ํบ์๋ณด๊ธฐ
2024.05.07 -
[Algorithm] ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ณธ (๋ฒ๋ธ/์ ํ/์ฝ์ )
[Algorithm] ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ณธ (๋ฒ๋ธ/์ ํ/์ฝ์ )
2024.05.06 -
[React] ๋ฆฌ์กํธ Suspense ํบ์๋ณด๊ธฐ
[React] ๋ฆฌ์กํธ Suspense ํบ์๋ณด๊ธฐ
2024.05.06