´ÙÁß Merged Sort
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

¼Ò°³

¿©±â¿¡¼­´Â ´ÙÁßÀÇ ¸ÓÁö¼ÒÆ®(Merged Sort)¿¡ ´ëÇØ¼­ »ý°¢ÇØ º¸µµ·Ï ÇϰڴÙ. ¸ÓÁö¼ÒÆ®¸¦ Çϱâ À§Çؼ­´Â 3°³ÀÇ ¹öÆÛ°¡ ÇÊ¿äÇÏ´Ù´Â °ÍÀ» ¾Ë°í ÀÖÀ» °ÍÀÌ´Ù.

merged.png

  1. A¿¡ ÀڷḦ Áý¾î ³Ö°í
  2. B¿¡ ÀڷḦ Áý¾î ³ÖÀº´ÙÀ½
  3. A¿Í B¸¦ Merge ÇØ¼­ °á°ú¸¦ C¿¡ ³Ö´Â´Ù.
  4. »õ·Î¿î µ¥ÀÌÅͰ¡ ÀÖ´Ù¸é ´Ù½Ã A¿¡ ³Ö°í
  5. A¿Í C¸¦ Merged ÇØ¼­ °á°ú¸¦ B¿¡ ³õ´Â´Ù.
  6. À§ÀÇ ¼ø¼­¸¦ ¹Ýº¹ÇÑ´Ù.

ÀÌ·¯ÇÑ ÀϹÝÀûÀÎ merged sort´Â ±×´ÙÁö ¾î·Á¿ï °ÍÀÌ ¾ø´Ù°í »ý°¢µÈ´Ù. ±×·¯³ª ´ÙÀ½°ú °°Àº °æ¿ì¸¦ »ý°¢Çغ¼ ¼ö ÀÖ´Ù.

mmerged.png

3°³ÀÇ A, B, C ±×·ìÀÌ ÀÖ°í, C±×·ìÀÇ µ¥ÀÌÅ͵éÀ» ¸ÓÁö¼ÒÆ®ÇÑ °á°ú¿Í B±×·ìÀÇ µ¥ÀÌÅ͵éÀ» ¸ÓÁö¼ÒÆ®ÇÑ °á°ú¸¦ ´Ù½Ã ¸ÓÁö ¼ÒÆ®Çϰí, ÀÌ °á°ú¸¦ ´Ù½Ã A±×·ìÀÇ ¸ÓÁö¼ÒÆ®ÇÑ °á°úÀÇ ¸ÓÁö¼ÒÆ®ÇØ¼­ ÃÖÁ¾ °á°ú¸¦ °¡Á®¿Â´Ù.

ÀÌ·¯ÇÑ ¿ä±¸´Â °°ÀÌ °¡ÁßÄ¡(Level)¸¦ ´Þ¸®ÇÏ´Â ¼­·Î´Ù¸¥ ±×·ì¿¡ ´ëÇØ¼­ ¸ÓÁö¼ÒÆ®Çϰí ÀÌµé ±×·ìÀ» ´Ù½Ã ¸ÓÁö¼ÒÆ®ÇØ¼­ Score¸¦ »êÃâÇØ¾ß ÇÏ´Â °Ë»ö¿£Áøµî¿¡¼­ ¹ß»ýÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

°£´ÜÈ÷ »ý°¢ÇÏÀÚ¸é, °¢ ±×·ìÀ» ¸ÓÁö¼ÒÆ®Çϴµ¥ 3°³ÀÇ ¹öÆÛ°¡ ÇÊ¿äÇϹǷÎ, 3x2 = 6°³ÀÇ ¹öÆÛ·Î ÇÊ¿äÇÑ °è»êÀ» ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×·¯³ª ÀÌ °æ¿ì ´ë·®ÀÇ ¸Þ¸ð¸®¸¦ ³¶ºñÇÒ ¼ö ÀÖ´Ù´Â ¹®Á¦°¡ ¹ß»ýÇÑ´Ù. ¸ÓÁö¼ÒÆ®ÇØ¾ßÇÒ µ¥ÀÌÅͰ¡ 1,000,000ÀÇ ·¹ÄÚµå·Î ÀÌ·ç¾îÁ® ÀÖ°í, °¢°¢ÀÇ ·¹ÄÚµåÀÇ Å©±â°¡ 20byte Á¤µµ¶ó¸é ÇѹøÀÇ ¸ÓÁö¼ÒÆ®¸¦ À§Çؼ­ 120MÀÇ ¸Þ¸ð¸®¸¦ ¼ÒºñÇØ¾ß ÇÑ´Ù. ¿©±â¿¡ µ¿½ÃÁ¢¼Ó±îÁö Á¦¾îÇØ¾ß ÇÏ´Â ¼­ºñ½º¿¡ »ç¿ëµÉ ¿£ÁøÀ̶ó¸é, 10¸íÀÌ Á¢¼ÓÇßÀ» ¶§, 1.2±â°¡ÀÇ ¸Þ¸ð¸®¸¦ ¼ÒºñÇÏ°Ô µÈ´Ù.

ÀÌ·¯ÇÑ °æ¿ì memoryÇ®À» À¯ÁöÇØ¼­, ÇÒ´çÇÏ´Â µîÀÇ ¹æ¹ýÀ» °í·ÁÇØ¾ß °ÚÀ¸³ª ¿ì¼±ÀûÀ¸·Î »ç¿ëÇÑ ¸Þ¸ð¸®ÀÇ ¾çÀ» ÁÙÀÏ Çʿ䰡 ÀÖ´Ù. ÀÌ ¹æ¹ý¿¡ ´ëÇØ¼­ °í¹ÎÇØº¸±â·Î Çß´Ù.

¹öÆÛ ·¹ÆÛ·±½º °ü¸®

ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­ °¡´ÉÇÑ ÃÖ¼ÒÀÇ ¹öÆÛ¸¦ ¸¸µé¾î ·¹ÆÛ·±½º¸¦ ÀÌ¿ëÇØ¼­ Àç»ç¿ëÇÏ´Â ¹æ¹ýÀ» »ý°¢ÇØ º¸¾Ò´Ù. ¹öÆÛÇ®À» À¯ÁöÇϱâ À§ÇÑ ¹æ¹ýÀ̶ó°í º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

doublemerged.png

¿©±â¿¡´Â 4°³ÀÇ ¹öÆÛ°¡ »ç¿ëµÈ´Ù.
  1. Buff Manager°¡ 4°³ÀÇ ¹öÆÛÁß 3°³¸¦ ¾ò¾î³½ ´ÙÀ½ Lv1 Merged Sorter ¿¡°Ô µ¹·ÁÁØ´Ù.
    1. Lv1 Merged Sorted´Â ÁÖ¾îÁø 3°³ÀÇ ¹öÆÛ¸¦ ÀÌ¿ëÇØ¼­ Merged Sorted¸¦ ÇÑ´Ù.
    2. ¸¶Áö¸·À¸·Î °á°ú¸¦ ÀúÀåÇÑ ¹öÆÛÀÇ ·¹ÆÛ·±½º(ÁÖ¼Ò°ª)À» ÀúÀåÇÑ´Ù.
  2. Buffer Manager°¡ 4°³ÀÇ ¹öÆÛÁß 3°³¸¦ ¾ò¾î³½ ´ÙÀ½ Lv2 Merged Sorted ¿¡°Ô µ¹·ÁÁØ´Ù.
    1. À̶§ Lv1 Merged SorterÀÇ ÃÖÁ¾°á°ú¹°ÀÌ ÀúÀåµÈ ¹öÆÛ´Â »ç¿ëÇÏ¸é ¾ÈµÈ´Ù.
    2. ¿ì¸®´Â Lv1 SorterÀÇ °á°ú¹° ¹öÆÛÀÇ ·¹ÆÛ·±½º¸¦ ¾Ë°í ÀÖÀ¸¹Ç·Î, À̰ÍÀ» Á¦¿ÜÇÑ 3°³ÀÇ ¹öÆÛ¸¦ Lv2 Sorter¿¡°Ô ÇÒ´çÇÒ ¼ö ÀÖ´Ù.
    3. Lv2 SorterÀº ÁÖ¾îÁø 3°³ÀÇ ¹öÆÛ¸¦ ÀÌ¿ëÇØ¼­ merged Sorted¸¦ ¼öÇàÇÑ´Ù.
    4. ÃÖÁ¾°á°ú¸¦ ÀúÀåÇÑ ¹öÆÛÀÇ ·¹ÆÛ·±½º¸¦ ÀúÀåÇÑ´Ù.
  3. ÀÌÁ¦ µÎ°³ÀÇ ¹öÆÛ¿¡ Lv1 Sorter °ú Lv2 SorterÀÇ °á°ú¹°ÀÌ ÀÖ´Ù. µÎ°³¸¦ mergedÇØ¼­ »ç¿ë°¡´ÉÇÑ ¹öÆÛ¿¡ °á°ú¹°À» ÀúÀåÇÑ´Ù.

´ÙÀ½Àº ±¸ÇöÄÚµå´Ù. ¾ÆÀ̵ð¾î°¡ ½ÇÇöµÇ´ÂÁö¸¦ È®ÀÎÇϱâ À§ÇÑ ÄÚµå·Î µ¥ÀÌÅÍ´Â intÇüÀ¸·Î ´ë½ÅÇßÀ¸¸ç, ½ÇÁ¦ merged sort¸¦ ÇÏÁö ¾Ê°í, 2°³ÀÇ intÇü ¹öÆÛ¿¡ ÀÖ´Â °ªÀ» ´õÇØ¼­ ³²´Â ¹öÆÛ¿¡ ÀúÀåÇϵµ·Ï Çß´Ù. ½ÇÁ¦ ±¸ÇöÀº intÇü´ë½Å, Ŭ·¡½º³ª ±¸Á¶Ã¼¿Í °°Àº ÀڷᱸÁ¶°¡ µé¾î°¡°í, µ¡¼À¿¬»ê´ë½Å¿¡ Merged Sort ¿¬»êÀÌ µé¾î°¥ °ÍÀÌ´Ù. ¾î¶µç ¾ÆÀ̵ð¾î¸¦ Å×½ºÆ®Çϴµ¥¿¡´Â ¹«¸®°¡ ¾øÀ» °ÍÀ¸·Î »ý°¢µÈ´Ù.

¾ÆÀ̵ð¾î ±¸Çö¿¡ ÁýÁßÇϱâ À§Çؼ­ STLÀ» »ç¿ëÇß´Ù.

  1. 4°³ÀÇ intÇü ¹öÆÛÁß¿¡ 3°³ÀÇ intÇü ¹öÆÛ¸¦ ÇÒ´çÇÑ´Ù.
    1. ù¹øÂ° ¹öÆÛ¿¡ 1ÀÌ µé¾î°£´Ù.
    2. µÎ¹øÂ° ¹öÆÛ¿¡ 2°¡ µé¾î°£´Ù.
    3. 3¹øÂ° ¹öÆÛ¿¡ 1+2=3 ÀÌ µé¾î°£´Ù.
    4. 4¹øÂ° ¹öÆÛ¿¡ 3ÀÌ µé¾î°£´Ù.
    5. 5¹øÂ° ¹öÆÛ¿¡ 3+3=6 ÀÌ µé¾î°£´Ù.
    6. Áï 101¹øÀ» ·çÇÁ¸¦ µ¹¸é 5050À̶ó´Â °ªÀÌ ³ª¿Í¾ß ÇÑ´Ù.
  2. 4°³ÀÇ intÇü ¹öÆÛÁß¿¡, ÀÌÀü °á°ú°ªÀÌ ÀúÀåµÈ ¹öÆÛ¸¦ Á¦¿ÜÇÑ 3°³¸¦ ÇÒ´çÇÑ´Ù.
    1. 1¹øÀ» ¹Ýº¹ÇÑ´Ù.
  3. 2°³ÀÇ ¹öÆÛ°¡ ¸ðµÎ á´Ù¸é, ÀÌ°É ´Ù½Ã ´õÇØ¼­ ³²´Â ¹öÆÛ¿¡ ³Ö´Â´Ù.

#include <iostream> 
#include <vector> 
#include <stdlib.h> 
#include <unistd.h> 
 
using namespace std; 
 
#define BUFSIZE  4 
 
class Buff 
{ 
    private: 
        int currentIdx; 
        vector<int *> LBuf; 
        int *tmpptr; 
 
    public: 
        Buff() 
        { 
            currentIdx = 0; 
        } 
 
        void Set(int *a) 
        { 
            LBuf.push_back(a); 
        } 
 
        void Clear() 
        { 
            LBuf.clear(); 
        } 
 
        // Merged Sort¸¦ ÇÑ´Ù.  
        // ¿©±â¿¡¼­´Â + ¿¬»êÀ» ÇÑ´Ù. 
        void SetUnion(int a) 
        { 
            int current = (currentIdx+1)%3; 
            int prev = (currentIdx)%3; 
            int tmp = (currentIdx+2)%3; 
 
            if (*LBuf[prev] != -1) 
            { 
                currentIdx++; 
            } 
            *LBuf[current] = a; 
            *LBuf[tmp] = a + *LBuf[prev];  
            printf("Debug %d + %d = %d\n", *LBuf[current], *LBuf[prev], *LBuf[tmp]); 
            currentIdx ++; 
 
            tmpptr = LBuf[(currentIdx)%3]; 
        } 
 
        // °á°ú°¡ ÀúÀåµÈ ¹öÆÛÀÇ ·¹ÆÛ·±½º¸¦ ³Ñ°ÜÁØ´Ù. 
        int *GetSumResult() 
        { 
            return tmpptr;  
        } 
 
        int TmpIdx() 
        { 
            return currentIdx; 
        } 
}; 
 
class BufManager 
{ 
    private: 
        int *a; 
        vector<Buff> NodeBuf; 
        int checkIdx; 
 
    public: 
 
        BufManager() 
        { 
            // ¹öÆÛ¸¦ 4°³ ÇÒ´çÇÑ´Ù. 
            a = (int *)malloc(sizeof(int) * BUFSIZE); 
            checkIdx = 3; 
        } 
 
        void Run() 
        { 
            Buff lBuff1, lBuff2; 
 
            // °¢°¢ÀÇ Buff1¿¡ 3°³¾¿ÀÇ ¹öÆÛÀÇ ·¹ÆÛ·±½º¸¦ ÇÒ´çÇÑ´Ù. 
            for (int i = 0; i < BUFSIZE; i++) 
            { 
                a[i] = -1; 
                if (&a[i] != &a[checkIdx]) 
                { 
                    lBuff1.Set(&a[i]); 
                } 
            } 
            NodeBuf.push_back(lBuff1); 
 
            for (int i = 0; i < BUFSIZE; i++) 
            { 
                a[i] = -1; 
                if (&a[i] != &a[checkIdx]) 
                { 
                    lBuff1.Set(&a[i]); 
                } 
            } 
            NodeBuf.push_back(lBuff2); 
 
            int idxflag = 0; 
            int idx; 
 
            // 2°³ÀÇ ±×·ìÀÌ ÀÖ´Ù°í °¡Á¤ÇÏ°í ·çÇÁ¸¦ µ¹·È´Ù.  
            for (int i = 0; i < 2; i++) 
            { 
                Buff Bf; 
                idxflag = i % 2; 
                printf("Node Number %d\n", idxflag); 
                getchar(); 
 
                // 101¹øÀÇ merged Sort°¡ ÀÌ·ç¾îÁø´Ù°í °¡Á¤ÇÑ´Ù. 
                for (int k = i; k < 101+i; k++) 
                { 
                    NodeBuf[idxflag].SetUnion(k); 
                } 
 
                // merged Sort°¡ ³¡³µ´Ù¸é, ¹öÆÛ¸¦ ÃʱâÈ­ ÇÑ´Ù. 
                NodeBuf[idxflag].Clear(); 
                checkIdx = NodeBuf[idxflag].TmpIdx(); 
 
                // 2°³ÀÇ ¹öÆÛ¿¡ °á°ú°ªÀÌ ¸¸µé¾îÁ³´Ù¸é, ÀÌ µÎ°³¸¦ ´Ù½Ã Merged sortÇÑ´Ù. 
                // ¾Æ·¡ÀÇ ÄÚµå´Â SetUnion ¸Þ¼­µå¸¦ »ç¿ëÇϵµ·Ï ¹Ù²Ü ¼ö ÀÖÀ» °ÍÀÌ´Ù. 
                if (i > 0) 
                { 
                    printf("RESULT : %d : %d\n", *NodeBuf[0].GetSumResult(), *NodeBuf[1].GetSumResult() ); 
                    getchar(); 
                } 
 
                // ´ÙÀ½ LevelÀÇ Merged Sort¸¦ À§Çؼ­ 3°³ÀÇ ¸Þ¸ð¸®ÀÇ ·¹ÆÛ·±½º¸¦ ÇÒ´çÇÑ´Ù.   
                // À̶§ ÀÌÀü¿¡ °á°ú°ªÀÌ ÀÖ´Â ¸Þ¸ð¸®´Â »ç¿ëÇÏÁö ¾Êµµ·Ï ÇÑ´Ù.  
                for (int k = 0; k < BUFSIZE; k++) 
                { 
                    // ÁÖ¼Ò°ªÀÌ °°Áö ¾ÊÀ» °æ¿ì¿¡¸¸ ÇÒ´çÇÑ´Ù. 
                    if (&a[k] != NodeBuf[idxflag].GetSumResult()) 
                    { 
                        a[k] = -1; 
                        printf("SET %d\n", k); 
                        Bf.Set(&a[k]); 
                    } 
                } 
                NodeBuf[idxflag?0:1] = Bf; 
                printf("Current Result : %d\n", *NodeBuf[idxflag].GetSumResult()); 
                getchar(); 
            } 
        } 
}; 
 
int main(int argc, char **argv) 
{ 
    BufManager *MyBuff;  
    MyBuff = new BufManager(); 
    MyBuff->Run(); 
} 
 

¾à°£ ¼öÁ¤µÈ ÄÚµå

µ¿ÀÏÇÏ°Ô SetUnion ¸Þ¼­µå¸¦ »ç¿ëÇϵµ·Ï ¾à°£ ¼öÁ¤Çß´Ù.
#include <iostream> 
#include <vector> 
#include <stdlib.h> 
#include <unistd.h> 
 
using namespace std; 
 
#define BUFSIZE  4 
 
class Buff 
{ 
    private: 
        int currentIdx; 
        vector<int *> LBuf; 
        int *tmpptr; 
    public: 
         
        Buff() 
        { 
            currentIdx = 0; 
        } 
 
        void Set(int *a) 
        { 
            LBuf.push_back(a); 
        } 
 
        void Clear() 
        { 
            LBuf.clear(); 
        } 
 
        void SetUnion(int a) 
        { 
            int current = (currentIdx+1)%3; 
            int prev = (currentIdx)%3; 
            int tmp = (currentIdx+2)%3; 
 
            if (*LBuf[prev] != -1) 
            { 
                currentIdx++; 
            } 
            *LBuf[current] = a; 
            *LBuf[tmp] = a + *LBuf[prev];  
            printf("Debug %d + %d = %d\n", *LBuf[current], *LBuf[prev], *LBuf[tmp]); 
            currentIdx ++; 
 
            tmpptr = LBuf[(currentIdx)%3]; 
        } 
 
        int *GetSumResult() 
        { 
            return tmpptr;  
        } 
        int TmpIdx() 
        { 
            return currentIdx; 
        } 
}; 
 
class BufManager 
{ 
    private: 
        int *a; 
        vector<Buff> NodeBuf; 
        int checkIdx; 
 
    public: 
 
        BufManager() 
        { 
            a = (int *)malloc(sizeof(int) * BUFSIZE); 
            checkIdx = 3; 
        } 
 
        void Run() 
        { 
            Buff lBuff1, lBuff2; 
 
            for (int i = 0; i < BUFSIZE; i++) 
            { 
                a[i] = -1; 
                if (&a[i] != &a[checkIdx]) 
                { 
                    lBuff1.Set(&a[i]); 
                } 
            } 
            NodeBuf.push_back(lBuff1); 
 
            for (int i = 0; i < BUFSIZE; i++) 
            { 
                a[i] = -1; 
                if (&a[i] != &a[checkIdx]) 
                { 
                    lBuff1.Set(&a[i]); 
                } 
            } 
            NodeBuf.push_back(lBuff2); 
 
            int idxflag = 0; 
            int idx; 
            for (int i = 0; i < 3; i++) 
            { 
                Buff Bf; 
                idxflag = i % 2; 
                printf("Node Number %d\n", idxflag); 
                getchar(); 
                for (int k = 0; k < 10; k++) 
                { 
                    NodeBuf[idxflag].SetUnion(k); 
                } 
 
                NodeBuf[idxflag].Clear(); 
 
                checkIdx = NodeBuf[idxflag].TmpIdx(); 
                if (i > 0) 
                { 
                    int another = idxflag?0:1;  
 
                    printf("RESULT : %d : %d\n", *NodeBuf[idxflag].GetSumResult(), *NodeBuf[another].GetSumResult() ); 
                    NodeBuf[idxflag].SetUnion(*NodeBuf[another].GetSumResult()); 
                    printf("Current Result : %d\n", *NodeBuf[idxflag].GetSumResult()); 
                    getchar(); 
                } 
 
                for (int k = 0; k < BUFSIZE; k++) 
                { 
                    if (&a[k] != NodeBuf[idxflag].GetSumResult()) 
                    { 
                        a[k] = -1; 
                        Bf.Set(&a[k]); 
                    } 
                } 
                NodeBuf[idxflag?0:1] = Bf; 
 
                //printf("Current Result : %d\n", *NodeBuf[idxflag].GetSumResult()); 
                getchar(); 
            } 
        } 
}; 
 
int main(int argc, char **argv) 
{ 
    BufManager *MyBuff;  
    MyBuff = new BufManager(); 
    MyBuff->Run(); 
} 
 

°á·Ð

¹öÆÛÇ®À» ÀÌ¿ëÇÑ merged sort´Â À¯¿¬ÇÏ°Ô È®Àå°¡´ÉÇÏ´Ù´Â ÀåÁ¡ÀÌ ÀÖ´Ù. °Ë»ö¿£ÁøÀ» ¿¹·Î µéÀÚ¸é, ¾îÀýÀÌ ºÐ¸®µÉ °æ¿ì, 2°³ ÀÌ»óÀÇ Æ®¸®¸¦ °¡Áö°Ô µÉ°Çµ¥, ÀÌ·¸°Ô ´Ù¼öÀÇ Æ®¸®¸¦ °¡Áö´Â µ¥ÀÌÅ͵éÀ» merged sort ÇÏ±æ ¿øÇÑ´Ù¸é, 5°³ÀÇ ¹öÆÛ¸¦ °¡Áö´Â Ç®À» À¯ÁöÇÏ¸é µÉ °ÍÀÌ´Ù.

multi_tree.png

°ü·Ã±Û

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.