Algorithm

[Algorithm] ํ•ฉ๋ณ‘์ •๋ ฌ (Merge sort)

yevdev 2021. 9. 28. 21:55

๐Ÿ’กํ•ฉ๋ณ‘์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜?

  • ์•ˆ์ •์ •๋ ฌ์— ์†ํ•˜๋ฉฐ, ๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•˜๋‚˜
  • ๋ถ„ํ•  ์ •๋ณต ๋ฐฉ๋ฒ• (divide and conquer)
    • ๋ฌธ์ œ๋ฅผ ์ž‘์€ 2๊ฐœ์˜ ๋ฌธ์ œ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ๊ฐ๊ฐ์„ ํ•ด๊ฒฐํ•œ ๋‹ค์Œ, ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์•„์„œ ์›๋ž˜์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ
    • ๋Œ€๊ฐœ ์ˆœํ™˜ ํ˜ธ์ถœ์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ (์žฌ๊ท€์ )
  • ๊ณผ์ •
    1. ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด๊ฐ€ 0 ๋˜๋Š” 1์ด๋ฉด ์ด๋ฏธ ์ •๋ ฌ๋œ ๊ฒƒ์œผ๋กœ ๋ณธ๋‹ค.
    2. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ, ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ์ž˜๋ผ ๋น„์Šทํ•œ ํฌ๊ธฐ์˜ ๋‘ ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ๋กœ ๋‚˜๋ˆˆ๋‹ค.
    3. ๊ฐ ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ•ฉ๋ณ‘์ •๋ ฌ์„ ์ด์šฉํ•ด ์ •๋ ฌ
    4. ๋‘๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ํ•˜๋‚˜์˜ ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ๋กœ ํ•ฉ๋ณ‘

[ ํ•ฉ๋ณ‘์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ตฌ์ฒด์ ์ธ ๊ฐœ๋… ]

  • ํ•˜๋‚˜์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‘๊ฐœ์˜ ๊ท ๋“ฑํ•œ ํฌ๊ธฐ๋กœ ๋ถ„ํ• ํ•˜๊ณ  ๋ถ„ํ• ๋œ ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•œ ๋‹ค์Œ, ๋‘๊ฐœ์˜ ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•ฉํ•˜์—ฌ ์ „์ฒด๊ฐ€ ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋˜๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ๋‹จ๊ณ„
    • ๋ถ„ํ•  (Divide) : ์ž…๋ ฅ ๋ฐฐ์—ด์„ ๊ฐ™์€ ํฌ๊ธฐ์˜ 2๊ฐœ์˜ ๋ถ€๋ถ„ ๋ฐฐ์—ด๋กœ ๋ถ„ํ• 
    • ์ •๋ณต (Conquer) : ๋ถ€๋ถ„ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•œ๋‹ค. ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ž‘์ง€ ์•Š์œผ๋ฉด ์ˆœํ™˜ ํ˜ธ์ถœ๋กœ ๋‹ค์‹œ ๋ถ„ํ•  ์ •๋ณต ๋ฐฉ๋ฒ•์„ ์ ์šฉ
    • ๊ฒฐํ•ฉ (Combine) : ์ •๋ ฌ๋œ ๋ถ€๋ถ„ ๋ฐฐ์—ด๋“ค์„ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด์— ํ•ฉ๋ณ‘
  • ํ•ฉ๋ณ‘ ์ •๋ ฌ์˜ ๊ณผ์ •
    • ์ถ”๊ฐ€์ ์ธ ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ•„์š”
    • ๊ฐ ๋ถ€๋ถ„ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•  ๋•Œ๋„ ํ•ฉ๋ณ‘ ์ •๋ ฌ์„ ์ˆœํ™˜์ ์œผ๋กœ ํ˜ธ์ถœํ•˜์—ฌ ์ ์šฉํ•œ๋‹ค.
    • ํ•ฉ๋ณ‘ ์ •๋ ฌ์—์„œ ์‹ค์ œ๋กœ ์ •๋ ฌ์ด ์ด๋ฃจ์–ด์ง€๋Š” ์‹œ์ ์€ 2๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•ฉ๋ณ‘(merge)ํ•˜๋Š” ๋‹จ๊ณ„์ด๋‹ค.

 

๐Ÿ’ก ํ•ฉ๋ณ‘ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์˜ˆ์ œ

  • ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ๋ฐฐ์—ด์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ž๋ฃŒ๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด๋ณด์ž.
  • 2๊ฐœ์˜ ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•ฉ๋ณ‘(merge)ํ•˜๋Š” ๊ณผ์ •
    1. 2๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ’๋“ค์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ๋น„๊ตํ•˜์—ฌ ๋‘๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ’ ์ค‘์—์„œ ๋” ์ž‘์€ ๊ฐ’์„ ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ(sorted)๋กœ ์˜ฎ๊ธด๋‹ค.
    2. ๋‘˜์ค‘์—์„œ ํ•˜๋‚˜๊ฐ€ ๋๋‚ ๋•Œ๊นŒ์ง€ ์ด ๊ณผ์ •์„ ๋˜ํ’€์ด
    3. ๋งŒ์•ฝ ๋‘˜์ค‘์—์„œ ํ•˜๋‚˜์˜ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋จผ์ € ๋๋‚˜๊ฒŒ ๋˜๋ฉด ๋‚˜๋จธ์ง€ ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ’๋“ค์„ ์ „๋ถ€ ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ(sorted)๋กœ ๋ณต์‚ฌํ•œ๋‹ค.
    4. ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ(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์™€ ๋‹ค์ˆ˜์˜ ํ”„๋กœ์„ธ์„œ๋กœ ๊ตฌ์„ฑ๋œ ๊ทธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ ์žฅ์น˜์˜ ๋“ฑ์žฅ์œผ๋กœ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ณ‘๋ ฌํ™” ํ•˜๋Š”๋ฐ์— ํ•ฉ๋ณ‘ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ™œ์šฉ

 

ํ•ฉ๋ณ‘ ์ •๋ ฌ์˜ ์‹œ๊ฐ„๋ณต์žก๋„

  1. ๋ถ„ํ•  ๋‹จ๊ณ„ : ๋น„๊ต ์—ฐ์‚ฐ๊ณผ ์ด๋™ ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. (์ค‘๊ฐ„์˜ ์ธ๋ฑ์Šค ๊ณ„์‚ฐ๊ณผ 2๋ฒˆ์˜ ์žฌ๊ท€ํ˜ธ์ถœ -> O(1))
  2. ํ•ฉ๋ณ‘ ๋‹จ๊ณ„ : ์ˆซ์ž์˜ ๋น„๊ต ์—ฐ์‚ฐ ํšŸ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์š”์†Œ
    • ์ˆœํ™˜ ํ˜ธ์ถœ์˜ ๊นŠ์ด
      • ๋ฐฐ์—ด์˜ ์›์†Œ๊ฐœ์ˆ˜ 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)