๐กํฉ๋ณ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ?
- ์์ ์ ๋ ฌ์ ์ํ๋ฉฐ, ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ์ ํ๋
- ๋ถํ ์ ๋ณต ๋ฐฉ๋ฒ (divide and conquer)
- ๋ฌธ์ ๋ฅผ ์์ 2๊ฐ์ ๋ฌธ์ ๋ก ๋ถ๋ฆฌํ๊ณ ๊ฐ๊ฐ์ ํด๊ฒฐํ ๋ค์, ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์์ ์๋์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ
- ๋๊ฐ ์ํ ํธ์ถ์ ์ด์ฉํ์ฌ ๊ตฌํ (์ฌ๊ท์ )
- ๊ณผ์
- ๋ฆฌ์คํธ์ ๊ธธ์ด๊ฐ 0 ๋๋ 1์ด๋ฉด ์ด๋ฏธ ์ ๋ ฌ๋ ๊ฒ์ผ๋ก ๋ณธ๋ค.
- ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ, ์ ๋ ฌ๋์ง ์์ ๋ฆฌ์คํธ๋ฅผ ์ ๋ฐ์ผ๋ก ์๋ผ ๋น์ทํ ํฌ๊ธฐ์ ๋ ๋ถ๋ถ ๋ฆฌ์คํธ๋ก ๋๋๋ค.
- ๊ฐ ๋ถ๋ถ ๋ฆฌ์คํธ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํฉ๋ณ์ ๋ ฌ์ ์ด์ฉํด ์ ๋ ฌ
- ๋๋ถ๋ถ ๋ฆฌ์คํธ๋ฅผ ๋ค์ ํ๋์ ์ ๋ ฌ๋ ๋ฆฌ์คํธ๋ก ํฉ๋ณ
[ ํฉ๋ณ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌ์ฒด์ ์ธ ๊ฐ๋ ]
- ํ๋์ ๋ฆฌ์คํธ๋ฅผ ๋๊ฐ์ ๊ท ๋ฑํ ํฌ๊ธฐ๋ก ๋ถํ ํ๊ณ ๋ถํ ๋ ๋ถ๋ถ ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ ๋ค์, ๋๊ฐ์ ์ ๋ ฌ ๋ฆฌ์คํธ๋ฅผ ํฉํ์ฌ ์ ์ฒด๊ฐ ์ ๋ ฌ๋ ๋ฆฌ์คํธ๊ฐ ๋๊ฒ ํ๋ ๋ฐฉ๋ฒ
- ๋จ๊ณ
- ๋ถํ (Divide) : ์ ๋ ฅ ๋ฐฐ์ด์ ๊ฐ์ ํฌ๊ธฐ์ 2๊ฐ์ ๋ถ๋ถ ๋ฐฐ์ด๋ก ๋ถํ
- ์ ๋ณต (Conquer) : ๋ถ๋ถ ๋ฐฐ์ด์ ์ ๋ ฌํ๋ค. ๋ถ๋ถ ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ์ถฉ๋ถํ ์์ง ์์ผ๋ฉด ์ํ ํธ์ถ๋ก ๋ค์ ๋ถํ ์ ๋ณต ๋ฐฉ๋ฒ์ ์ ์ฉ
- ๊ฒฐํฉ (Combine) : ์ ๋ ฌ๋ ๋ถ๋ถ ๋ฐฐ์ด๋ค์ ํ๋์ ๋ฐฐ์ด์ ํฉ๋ณ
- ํฉ๋ณ ์ ๋ ฌ์ ๊ณผ์
- ์ถ๊ฐ์ ์ธ ๋ฆฌ์คํธ๊ฐ ํ์
- ๊ฐ ๋ถ๋ถ ๋ฐฐ์ด์ ์ ๋ ฌํ ๋๋ ํฉ๋ณ ์ ๋ ฌ์ ์ํ์ ์ผ๋ก ํธ์ถํ์ฌ ์ ์ฉํ๋ค.
- ํฉ๋ณ ์ ๋ ฌ์์ ์ค์ ๋ก ์ ๋ ฌ์ด ์ด๋ฃจ์ด์ง๋ ์์ ์ 2๊ฐ์ ๋ฆฌ์คํธ๋ฅผ ํฉ๋ณ(merge)ํ๋ ๋จ๊ณ์ด๋ค.
๐ก ํฉ๋ณ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์์
- ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ๋ฐฐ์ด์ด ์๋ค๊ณ ๊ฐ์ ํ๊ณ ์๋ฃ๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํด๋ณด์.
- 2๊ฐ์ ์ ๋ ฌ๋ ๋ฆฌ์คํธ๋ฅผ ํฉ๋ณ(merge)ํ๋ ๊ณผ์
- 2๊ฐ์ ๋ฆฌ์คํธ์ ๊ฐ๋ค์ ์ฒ์๋ถํฐ ํ๋์ฉ ๋น๊ตํ์ฌ ๋๊ฐ์ ๋ฆฌ์คํธ์ ๊ฐ ์ค์์ ๋ ์์ ๊ฐ์ ์๋ก์ด ๋ฆฌ์คํธ(sorted)๋ก ์ฎ๊ธด๋ค.
- ๋์ค์์ ํ๋๊ฐ ๋๋ ๋๊น์ง ์ด ๊ณผ์ ์ ๋ํ์ด
- ๋ง์ฝ ๋์ค์์ ํ๋์ ๋ฆฌ์คํธ๊ฐ ๋จผ์ ๋๋๊ฒ ๋๋ฉด ๋๋จธ์ง ๋ฆฌ์คํธ์ ๊ฐ๋ค์ ์ ๋ถ ์๋ก์ด ๋ฆฌ์คํธ(sorted)๋ก ๋ณต์ฌํ๋ค.
- ์๋ก์ด ๋ฆฌ์คํธ(sorted)๋ฅผ ์๋์ ๋ฆฌ์คํธ(list)๋ก ์ฎ๊ธด๋ค.
#include <iostream>
using namespace std;
int sorted[9]; //์ถ๊ฐ์ ์ธ ์์ ๋ฐฐ์ด ๊ณต๊ฐ
// i: ์ ๋ ฌ๋ ์ผ์ชฝ ๋ฆฌ์คํธ์ ๋ํ ์ธ๋ฑ์ค
// j: ์ ๋ ฌ๋ ์ค๋ฅธ์ชฝ ๋ฆฌ์คํธ์ ๋ํ ์ธ๋ฑ์ค
// k: ์ ๋ ฌ๋ ๋ฆฌ์คํธ์ ๋ํ ์ธ๋ฑ์ค
/* 2๊ฐ์ ์ธ์ ํ ๋ฐฐ์ด list[left...mid]์ list[mid+1...right]์ ํฉ๋ณ ๊ณผ์ */
/* (์ค์ ๋ก ์ซ์๋ค์ด ์ ๋ ฌ๋๋ ๊ณผ์ ) */
void merge(int list[], int left, int mid, int right){
int i,j,k,l;
i = left;
j = mid+1;
k = left;
// ๋ถํ ๋ ์ ๋ ฌ๋ฆฌ์คํธ ๋๊ฐ๋ฅผ ํฉ๋ณ
while(i=<mid && j<=right){
if(list[i]<list[j]){
sorted[k++] = list[i++];
}
else{
sorted[k++] = list[j++];
}
};
// ๋จ์ ์๋ ๊ฒ๋ค์ ์ผ๊ด ๋ณต์ฌ
if(j<=right){
for(l=j;l<=right;l++){
sorted[k++] = list[l];
};
}
if(i<=mid){
for(l=i;l<=mid;l++){
sorted[k++] = list[l];
};
}
// ์์๋ฐฐ์ด sorted[] ์ ์๋ ๊ฐ๋ค์ list[]๋ก ๋ณต์ฌ
for(l=left;l<=right;l++){
list[l] = sorted[l];
};
}
// ํฉ๋ณ ์ ๋ ฌ
void mergeSort(int list[], int left, int right){
int mid;
if(left<right){
mid = (left+right) / 2;
mergeSort(list, left, mid);
mergeSort(list, mid+1, right);
merge(list, left, mid, right);
};
}
int main(){
int list[9] = {21, 10, 12, 20, 25, 13, 15, 22, 33};
mergeSort(list, 0, 8);
for(int i=0;i<9;i++){
cout << list[i]<< " ";
};
}
์ฝ๋๊ณผ์
๐ก ํฉ๋ณ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ํน์ง
๋จ์
- ์
๋ ฅ์ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ (์
๋ ฅ๋ฐฐ์ด)์ธ์ ์ถ๊ฐ๋ก ์
๋ ฅ๊ณผ ๊ฐ์ ํฌ๊ธฐ์ ๊ณต๊ฐ (์์๋ฐฐ์ด)์ด ๋ณ๋๋ก ํ์ํ๋ค.
- 2๊ฐ์ ์ ๋ ฌ๋ ๋ถ๋ถ์ ํ๋๋ก ํฉ๋ณํ๊ธฐ ์ํด, ํฉ๋ณ๋ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ๊ณณ์ด ํ์ํ๊ธฐ ๋๋ฌธ์
์ฅ์
- ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ ๋, ํต์ ๋ ฌ์ด๋ ํ ์ ๋ ฌ๋ณด๋ค ํจ์ฌ ํจ์จ์ ์ด๋ค.
- ๋งํฌ ์ธ๋ฑ์ค๋ง ๋ณ๊ฒฝ๋๋ฏ๋ก ๋ฐ์ดํฐ์ ์ด๋์ ๋ฌด์ํ ์ ์์ ์ ๋๋ก ์์์ง๋ค.
- ์ ์๋ฆฌ ์ ๋ ฌ๋ก ๊ตฌํํ ์ ์๋ค.
์์ฉ
- ๋ฉํฐ์ฝ์ด CPU์ ๋ค์์ ํ๋ก์ธ์๋ก ๊ตฌ์ฑ๋ ๊ทธ๋ํฝ ์ฒ๋ฆฌ ์ฅ์น์ ๋ฑ์ฅ์ผ๋ก ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ณ๋ ฌํ ํ๋๋ฐ์ ํฉ๋ณ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด ํ์ฉ
ํฉ๋ณ ์ ๋ ฌ์ ์๊ฐ๋ณต์ก๋
- ๋ถํ ๋จ๊ณ : ๋น๊ต ์ฐ์ฐ๊ณผ ์ด๋ ์ฐ์ฐ์ด ์ํ๋์ง ์๋๋ค. (์ค๊ฐ์ ์ธ๋ฑ์ค ๊ณ์ฐ๊ณผ 2๋ฒ์ ์ฌ๊ทํธ์ถ -> O(1))
- ํฉ๋ณ ๋จ๊ณ : ์ซ์์ ๋น๊ต ์ฐ์ฐ ํ์๊ฐ ๊ฐ์ฅ ์ค์ํ ์์
- ์ํ ํธ์ถ์ ๊น์ด
- ๋ฐฐ์ด์ ์์๊ฐ์ n์ด 2์ ๊ฑฐ๋ญ ์ ๊ณฑ์ด๋ผ๊ณ ๊ฐ์ ํ์ ( n = 2^k )
- n = 2^3 ์ผ ๊ฒฝ์ฐ, 2^3 -> 2^2 -> 2^1 -> 2^0 ์์ผ๋ก ์ค์ด๋ค์ด ์ํ ํธ์ถ์ ๊น์ด๊ฐ 3์์ ์ ์ ์๋ค.
- n = 2^k ์ผ ๊ฒฝ์ฐ, ์ํ ํธ์ถ์ ๊น์ด๋ k์ด๊ณ k = logโn ์ด๋ค.
- logโn
- ๊ฐ ํฉ๋ณ ๋จ๊ณ์ ๋น๊ต ์ฐ์ฐ
- ๋ฐฐ์ด A์ B์ ํฌ๊ธฐ๊ฐ ๊ฐ๊ฐ a,b๋ผ๋ฉด, ์ต๋ ๋น๊ต ํ์ = (a+b-1)
- ๊ฐ ์ธต์ ์ดํด๋ณด๋ฉด ๋ชจ๋ ์ซ์๊ฐ ํฉ๋ณ์ ์ฐธ์ฌ
- ํฉ๋ณ์ ์ ๋ ฅ ํฌ๊ธฐ์ ๋น๋กํ๋ฏ๋ก ๊ฐ ์ธต์์ ์ํ๋ ๋น๊ตํ์๋ O(n)
- ์ํ ํธ์ถ์ ๊น์ด ๋งํผ์ ํฉ๋ณ ๋จ๊ณ * ๊ฐ ํฉ๋ณ ๋จ๊ณ์ ๋น๊ต ์ฐ์ฐ = nlogโn
- ์ด๋ ํ์ (๊ทผ๋ฐ,, ๊ฒฐ๊ณผ๊ฐ ๋๊ฐ์์ ์ธ์ง ๊ต์๋๊ป์๋ ๋ฐ๋ก ์ด๋ถ๋ถ์ ๋ํด์ ๋ง์ ์์ผ์
จ์ ํ์ง๋ง ์ ๋ฆฌ๋ ํด๋๊ฒ ๋ค!)
- ์ํ ํธ์ถ์ ๊น์ด (ํฉ๋ณ ๋จ๊ณ์ ์) : logโn
- ๊ฐ ํฉ๋ณ ๋จ๊ณ์ ์ด๋ ์ฐ์ฐ : ์์ ๋ฐฐ์ด์ ๋ณต์ฌํ๋ค๊ฐ ๋ค์ ๊ฐ์ ธ์์ผ ๋๋ฏ๋ก ์ด๋์ฐ์ฐ์ ์ด ๋ถ๋ถ ๋ฐฐ์ด์ ๋ค์ด ์๋ ์์์ ๊ฐ์๊ฐ n์ธ ๊ฒฝ์ฐ, ๋ ์ฝ๋์ ์ด๋์ด 2n ๋ฒ ๋ฐ์
- ์ํ ํธ์ถ์ ๊น์ด ๋งํผ์ ํฉ๋ณ ๋จ๊ณ * ๊ฐ ํฉ๋ณ ๋จ๊ณ์ ์ด๋์ฐ์ฐ =. 2nlogโn
- T(n) = nlogโn(๋น๊ต) + 2nlogโn(์ด๋) = 3nlogโn = O(nlogโn)
- ์ํ ํธ์ถ์ ๊น์ด
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algorithm] ๊ทธ๋ฆฌ๋(Greedy) ์๊ณ ๋ฆฌ์ฆ (0) | 2021.10.06 |
---|---|
[Algorithm] ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ (0) | 2021.10.06 |
[Algorithm] ์ ํ๋ฌธ์ ์๊ณ ๋ฆฌ์ฆ (feat. Quick-Sort) (0) | 2021.09.29 |
[Algorithm] ํต ์ ๋ ฌ (Quick Sort) (0) | 2021.09.17 |
[Algorithm] ํผ๋ณด๋์นํจ / Fiona-chicken (0) | 2021.09.11 |