[์๊ณ ๋ฆฌ์ฆ] ๋ถํ ์ ๋ณต ๋ฐฉ๋ฒ - ์ด์ง ํ์, ํต ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
1. ๋ถํ ์ ๋ณต(Divide-and-Conquer) ๋ฐฉ๋ฒ
- ๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ ๊ธฐ๋ฒ ์ค ํ๋
- ๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ ๊ธฐ๋ฒ : ๋ถํ ์ ๋ณต(divide-and-conquer) ๋ฐฉ๋ฒ, ๋์ ํ๋ก๊ทธ๋๋ฐ(dynamic programming) ๋ฐฉ๋ฒ, ์์ฌ์์ด(greedy) ๋ฐฉ๋ฒ
1) ๋ถํ ์ ๋ณต ๋ฐฉ๋ฒ์ ์๋ฆฌ
- ์ํ์ (recursive)์ผ๋ก ๋ฌธ์ ๋ฅผ ํธ๋ ํํฅ์(top-down) ์ ๊ทผ ๋ฐฉ๋ฒ
์ฃผ์ด์ง ๋ฌธ์ ์ ์ ๋ ฅ์ ๋ ์ด์ ๋๋ ์ ์์ ๋๊น์ง ์ํ์ ์ผ๋ก ๋ถํ ํ๊ณ ๋ถํ ๋ ์์ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ ํ ๊ทธ ํด๋ฅผ ๊ฒฐํฉํ์ฌ ์๋ ๋ฌธ์ ์ ํด๋ฅผ ๊ตฌํ๋ ๋ฐฉ์
2) ๋ถํ ์ ๋ณต ๋ฐฉ๋ฒ์ ํน์ง
- ๋ถํ ๋ ์์ ๋ฌธ์ ๋ ์๋ ๋ฌธ์ ์ ์ฑ๊ฒฉ์ด ๋์ผํ๋ค. → ์ ๋ ฅ ํฌ๊ธฐ๋ง ์์์ง
- ๋ถํ ๋ ๋ฌธ์ ๋ ์๋ก ๋ ๋ฆฝ์ ์ด๋ค. → ์ํ์ ๋ถํ ๋ฐ ๊ฒฐ๊ณผ ๊ฒฐํฉ ๊ฐ๋ฅ
3) ๋ถํ ์ ๋ณต ๋ฐฉ๋ฒ์ ์ฒ๋ฆฌ ๊ณผ์ : ๋ถํ → ์ ๋ณต → ๊ฒฐํฉ
๋ถํ ์ ๋ณต ๋ฐฉ๋ฒ์ ๊ฐ ์ํ ํธ์ถ ์์ ์ฒ๋ฆฌ ๊ณผ์
- ๋ถํ : ์ฃผ์ด์ง ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ ๊ฐ์ ์์ ๋ฌธ์ ๋ก ๋ถํ
- ์ ๋ณต : ์์ ๋ฌธ์ ๋ค์ ์ํ์ ์ผ๋ก ๋ถํ ํ๊ณ ์์ ๋ฌธ์ ๊ฐ ๋ ์ด์ ๋ถํ ๋์ง ์์ ์ ๋๋ก ํฌ๊ธฐ๊ฐ ์ถฉ๋ถํ ์๋ค๋ฉด ์ํํธ์ถ ์์ด ์์ ๋ฌธ์ ์ ๋ํ ํด๋ฅผ ๊ตฌํจ
- ๊ฒฐํฉ : ์์ ๋ฌธ์ ์ ๋ํด ์ ๋ณต๋ ํด๋ฅผ ๊ฒฐํฉํ์ฌ ์๋ ๋ฌธ์ ์ ํด๋ฅผ ๊ตฌํจ
4) ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ - ์ด์ง ํ์, ํฉ๋ณ ์ ๋ ฌ, ํต ์ ๋ ฌ, ์ ํ ๋ฌธ์
๋ถํ ์ ๋ณต ๋ฐฉ๋ฒ์ด ์ ์ฉ๋ ์ด์ง ํ์, ํฉ๋ณ ์ ๋ ฌ, ํต ์ ๋ ฌ, ์ ํ ๋ฌธ์ ์๊ณ ๋ฆฌ์ฆ์์์ ๋ถํ ๊ณผ์
- n์ ์ ๋ ฅ ํฌ๊ธฐ = ๋ฐ์ดํฐ ์๋ฅผ ์๋ฏธ
- ๊ฒ์ ์์ผ๋ก ํ์๋ ๋ถ๋ถ์ ๋ฌธ์ ์์ ๋ฐฐ์ ๋ ๋ถ๋ถ
- ์ด์ง ํ์๊ณผ ํฉ๋ณ ์ ๋ ฌ์ ์ผ์ ํ๊ฒ ์ ๋ฐ์ฉ ๋ถํ
- ํต ์ ๋ ฌ๊ณผ ์ ํ ๋ฌธ์ ๋ ๋ถํ ํฌ๊ธฐ๊ฐ ์ผ์ ํ์ง ์์
2. ์ด์ง ํ์(Binary Search)
* ์ ๋ ฌ๋ ๋ฐ์ดํฐ์ ๋ํ ํจ๊ณผ์ ์ธ ํ์ ๋ฐฉ๋ฒ (์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์๋ค๊ณ ๊ฐ์ )
* ์ ๋ ฅ์ด ์ ๋ ฌ๋ ๋ฆฌ์คํธ์ ๋ํด์๋ง ์ ์ฉ ๊ฐ๋ฅ
* ์ฝ์ /์ญ์ ์ฐ์ฐ ์ ๋ฐ์ดํฐ์ ์ ๋ ฌ ์ํ ์ ์ง ํ์
- ํ๊ท n/2๊ฐ์ ๋ฐ์ดํฐ ์ด๋ ๋ฐ์
- ์ฝ์ /์ญ์ ๊ฐ ๋น๋ฒํ ์์ฉ์ ๋ถ์ ํฉ
* ๋ฐฐ์ด์ ๊ฐ์ด๋ฐ ์์์ ํ์ํค x๋ฅผ ๋น๊ต
1) ํ์ํค = ๊ฐ์ด๋ฐ ์์ → ํ์ ์ฑ๊ณต
2) ํ์ํค < ๊ฐ์ด๋ฐ ์์ → '์ด์ง ํ์(ํฌ๊ธฐ ½์ ์ผ์ชฝ ๋ถ๋ถ๋ฐฐ์ด)' ์ํ ํธ์ถ
3) ํ์ํค > ๊ฐ์ด๋ฐ ์์ → '์ด์ง ํ์(ํฌ๊ธฐ ½์ ์ค๋ฅธ์ชฝ ๋ถ๋ถ๋ฐฐ์ด)' ์ํ ํธ์ถ
* ํ์์ ๋ฐ๋ณตํ ๋๋ง๋ค ๋์ ์์์ ๊ฐ์๊ฐ ½์ฉ ๊ฐ์
* ์ฑ๋ฅ : Θ(logn)
1) ์ด์ง ํ์์ ๋ถํ ์ ๋ณต ๊ณผ์
- ๋ถํ : ๋ฐฐ์ด์ ๊ฐ์ด๋ฐ ์์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ๋ถ๋ถ๋ฐฐ์ด๋ก ๋ถํ . ํ์ํค์ ๊ฐ์ด๋ฐ ์์๊ฐ ๊ฐ์ผ๋ฉด ๋ฐํ ๋ฐ ์ข ๋ฃ
- ์ ๋ณต : ํ์ํค๊ฐ ๊ฐ์ด๋ฐ ์์๋ณด๋ค ์์ผ๋ฉด ์ผ์ชฝ ๋ถ๋ถ๋ฐฐ์ด์ ๋์์ผ๋ก ์ด์ง ํ์์ ์ํ ํธ์ถ, ํฌ๋ฉด ์ค๋ฅธ์ชฝ ๋ถ๋ถ๋ฐฐ์ด์ ๋์์ผ๋ก ์ด์ง ํ์์ ์ํํธ์ถ
- ๊ฒฐํฉ : ํ์ ๊ฒฐ๊ณผ๊ฐ ์ง์ ๋ฐํ๋๋ฏ๋ก ๊ฒฐํฉ ๋ถํ์
2) ์ด์ง ํ์ ์๊ณ ๋ฆฌ์ฆ - ์ํ ํํ
BinarySearch(A[], Left, Right, x) {
if (Left > Right) return -1; // ํ์ ์คํจ
Mid = floor((Left + Right)/2); // ๋ฐ๋ฅ ํจ์
if (x == A[Mid]) return Mid;
else {
if (x < Mid) BinarySearch(A, Left, Mid-1, x); // ์ผ์ชฝ ๋ถ๋ถ๋ฐฐ์ด
else BinarySearch(A, Mid+1, Right, x); // ์ค๋ฅธ์ชฝ ๋ถ๋ถ๋ฐฐ์ด
}
}
3) ์ด์ง ํ์ ์๊ณ ๋ฆฌ์ฆ - ๋ฐ๋ณต ํํ
BinarySearch_Iteration(A[], n, x) {
Left = 0;
Right = n-1;
while (Left <= Right) {
Mid = floor((Left+Right)/2); // ๋ฐ๋ฅ ํจ์
if (x == A[Mid]) return Mid; // ํ์ ์ฑ๊ณต
else {
if (x < Mid) Right = Mid - 1; // ์ผ์ชฝ ๋ถ๋ถ๋ฐฐ์ด
else Left = Mid + 1; // ์ค๋ฅธ์ชฝ ๋ถ๋ถ๋ฐฐ์ด
}
return -1; // ํ์ ์คํจ
}
4) ์ด์ง ํ์์ ์ฑ๋ฅ
- T(n) = logn
(1) ์ ๋ ฅ ํฌ๊ธฐ๊ฐ n์ผ๋ ์ต๋ ๋ถํ ํ์ k
์) ์ ๋ ฅ ํฌ๊ธฐ n = 8์ด๋ฉด ์ต๋ ๋ถํ ํ์ k = 3
(2) ์ ๋ ฅ ํฌ๊ธฐ๊ฐ n์ผ๋ ์ต๋ ๋น๊ต ํ์
์ต๋ ๋ถํ ํ์ + 1
(3) ์ฑ๋ฅ
BinarySearch(A[], Left, Right, x) {
// ์ค๋ต..
if (x == A[Mid]) return Mid; // ๋ฐ๊นฅ ์์ค
else {
// ์ํ ํธ์ถ
if (x < Mid) BinarySearch(A, Left, Mid-1, x);
else BinarySearch(A, Mid+1, Right, x);
}
}
T(n)
= ์ ๋ ฅ ํฌ๊ธฐ n์ ๋ํ ํ์ ๊ณผ์ ์์์ ๋ชจ๋ ๋น๊ต ํ์์ ํฉ
= ๋ฐ๊นฅ ์์ค์์์ ๋น๊ต ํ์ + ์ํ ํธ์ถ์์์ ๋น๊ต ํ์
3. ํต ์ ๋ ฌ(Quicksort)
* ํน์ ์์ ํผ๋ฒ(pivot)์ ๊ธฐ์ค์ผ๋ก ์ฃผ์ด์ง ๋ฐฐ์ด์ ๋ ๋ถ๋ถ๋ฐฐ์ด๋ก ๋ถํ ํ๊ณ ๊ฐ ๋ถ๋ถ๋ฐฐ์ด์ ๋ํด ํต ์ ๋ ฌ์ ์ํ์ ์ผ๋ก ์ ์ฉํ๋ ๋ฐฉ์
๋ถํ ํ ์ผ์ชฝ ๋ถ๋ถ๋ฐฐ์ด์ ๋ชจ๋ ๊ฐ < ํผ๋ฒ < ์ค๋ฅธ์ชฝ ๋ถ๋ถ๋ฐฐ์ด์ ๋ชจ๋ ๊ฐ
* ์ต์ /ํ๊ท ์ฑ๋ฅ Θ(nlogn)
* ์ต์ ์ฑ๋ฅ Θ(n²)
* ์ต์ ์ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ ๊ฑฐ์ ์์
- ํผ๋ฒ ์ ํ์ ์์์ฑ์ด ๋ณด์ฅ๋๋ฉด ํ๊ท ์ ์ธ ์ฑ๋ฅ์ ๋ณด์ผ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์
- ๋ฐฐ์ด์์ ์์๋ก ๊ฐ์ ์ ํํด์ ๋ฐฐ์ด์ ์ฒ์ ์์์ ๊ตํ ํ ์ ๋ ฌ ์ํ
1) ํต ์ ๋ ฌ์ ๋ถํ ์ ๋ณต ๊ณผ์
- ๋ถํ : ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ๋ฐฐ์ด์ ๋ ๋ถ๋ถ๋ฐฐ์ด๋ก ๋ถํ
- ์ ๋ณต : ๋ ๋ถ๋ถ๋ฐฐ์ด์ ๋ํด ํต ์ ๋ ฌ์ ์ํ์ ์ผ๋ก ์ ์ฉํ์ฌ ๊ฐ ๋ถ๋ถ๋ฐฐ์ด์ ์ ๋ ฌ
- ๊ฒฐํฉ : ๊ฒฐํฉ ๋ถํ์
2) ํต ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
void QuickSort(A[], n) {
if (n>1) {
pivot = Partition(A[0...n-1], n); // ๋ ๋ถ๋ถ๋ฐฐ์ด๋ก ๋ถํ
QuickSort(A[0...pivot-1], pivot); // ์ผ์ชฝ ๋ถ๋ถ๋ฐฐ์ด ์ํ ํธ์ถ
QuickSort(A[pivot+1...n-1], n-pivot-1); //์ค๋ฅธ์ชฝ ๋ถ๋ถ๋ฐฐ์ด ์ํ ํธ์ถ
}
}
int Partition(A[], n) {
Left = 1;
Right = n-1;
while (Left < Right) { // ํผ๋ฒ A[0]
// ํผ๋ฒ๋ณด๋ค ํฐ ๊ฐ์ ์์น๋ฅผ ์ฐพ์
while (Left < n && A[Left] < A[0]) Left++;
// ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ์ ์์น๋ฅผ ์ฐพ์
while (Right > 0 && A[Right] >= A[0]) Right--;
// Left, Right ๊ตํ
if (Left < Right) exchange(A[Left], A[Right]);
// ํผ๋ฒ, Right ๊ตํ
else exchange(A[0], A[Right]);
}
}
3) ํต ์ ๋ ฌ์ ์ฑ๋ฅ
- ํ๊ท : T(n) = O(nlogn)
- ์ต์
: T(n) = O(n²)
- ์ต์ : T(n) = O(nlogn)
(1) ๋ถํ ํจ์ Partition()์ ์ํ ์๊ฐ
Θ(n)
ํต ์ ๋ ฌ์ ๋ถํ ํจ์๋ Θ(n)์ ์ ํ ์๊ฐ์ ๊ฐ๋๋ค.
(2) ํต ์ ๋ ฌ QuickSort() ์ํ ์๊ฐ ๋ถ์
T(n)
= ํ ๋ฒ์ ๋ถํ ํจ์ Partition() ํธ์ถ + ๋ ๋ฒ์ ํต ์ ๋ ฌ ํจ์ QuickSort() ํธ์ถ
= Θ(n) + ๋ ๋ฒ์ ํต ์ ๋ ฌ ํจ์ QuickSort() ํธ์ถ
* ํต ์ ๋ ฌ - ์ต์ ์ ๊ฒฝ์ฐ
- ํผ๋ฒ์ ์ ์ธํ ๋๋จธ์ง ๋ชจ๋ ์์๊ฐ ํ๋์ ๋ถ๋ถ๋ฐฐ์ด๋ก ๋ถํ ๋๋ ๊ฒฝ์ฐ : ์ฆ ํผ๋ฒ์ด ํญ์ ๋ถ๋ถ๋ฐฐ์ด์ ์ต์๊ฐ ํน์ ์ต๋๊ฐ์ด ๋๋ ๊ฒฝ์ฐ
- ์ ๋ ฅ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋ ๋ฐ์ดํฐ์ด๊ณ ํผ๋ฒ์ด ๋ฐฐ์ด์ ์ฒ์ ์์์ธ ๊ฒฝ์ฐ
* ํต ์ ๋ ฌ - ์ต์ ์ ๊ฒฝ์ฐ
- ํผ๋ฒ์ ์ค์ฌ์ผ๋ก ํญ์ ๋์ผํ ํฌ๊ธฐ์ ๋ ๋ถ๋ถ๋ฐฐ์ด๋ก ๋ถํ ๋๋ ๊ฒฝ์ฐ
- ํผ๋ฒ์ด ํญ์ ๋ถ๋ถ๋ฐฐ์ด์ ์ค๊ฐ๊ฐ์ด ๋๋ ๊ฒฝ์ฐ
References
ํ๊ตญ๋ฐฉ์กํต์ ๋ํ๊ต ์ปดํจํฐ๊ณผํ๊ณผ ์๊ณ ๋ฆฌ์ฆ ๊ฐ์(์ด๊ด์ฉ)
๋๊ธ