42-4-¶ó.Èü ¿¬»ê

Èü(heap)À̶ó´Â ¸»Àº ÈçÈ÷ ±â¾ï Àå¼ÒÀÇ ÀÚÀ¯ ¿µ¿ªÀ» ÀǹÌÇϴµ¥ ÀÚ·á ±¸Á¶¿¡¼­ ¸»ÇÏ´Â ÈüÀº ÀÌ·± ¸Þ¸ð¸® ¿µ¿ªÀ» ¶æÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ´ÙÀ½°ú °°Àº Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ÀÚ·á ±¸Á¶¸¦ ÀǹÌÇÑ´Ù.

 

¨ç ù ¹øÂ° ¿ä¼Ò°¡ ±¸°£¿¡¼­ °¡Àå Å©´Ù.

¨è Ǫ½Ã, ÆË ¿¬»êÀÌ ·Î±× ½Ã°£³»·Î ¼öÇàµÉ ¼ö ÀÖ´Ù.

 

´ÜÁö, ù ¹øÂ° ¿ä¼Ò°¡ Á¦ÀÏ Å©±â¸¸À» ¿ä±¸ÇϹǷΠ³ª¸ÓÁö µÞºÎºÐÀº Å©±â¼øÀ¸·Î Á¤·ÄµÇÁö ¾Ê¾Æµµ »ó°ü¾ø´Ù. ¿ä±¸ »çÇ×ÀÌ ¸¹Áö ¾Ê±â ¶§¹®¿¡ »ðÀÔ, »èÁ¦ ¿¬»êµµ ÈξÀ ´õ ºü¸£´Ù. Èü ¿¬»ê ÇÔ¼öµéÀº ¿ì¼± ¼øÀ§ Å¥ ±¸Çö¿¡ ÈçÈ÷ »ç¿ëµÇ´Âµ¥ »ç½Ç STLÀÇ prority_queue ¾î´ðÅͰ¡ ÀÌ·± ÀÚ·á ±¸Á¶¸¦ Àß Á¦°øÇϹǷΠÈü ¿¬»ê ÇÔ¼öµéÀ» Á÷Á¢ »ç¿ëÇÒ ÀÏÀº °ÅÀÇ ¾ø´Ù. ´ÙÀ½ 4°³ÀÇ ÇÔ¼ö°¡ Èü ¿¬»êÀ» Á¦°øÇÑ´Ù.

 

void make_heap(RanIt first, RanIt last [,BinPred F]);

void sort_heap(RanIt first, RanIt last [,BinPred F]);

void push_heap(RanIt first, RanIt last [,BinPred F]);

void pop_heap(RanIt first, RanIt last [,BinPred F]);

 

¸ðµÎ ¿øÇüÀÌ µ¿ÀÏÇѵ¥ Àû¿ëÇÒ ±¸°£À» Àμö·Î Àü´Þ¹Þ°í ¿øÇÒ °æ¿ì Á¶°ÇÀÚ¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. µðÆúÆ® Á¶°ÇÀÚ´Â lessÀÌ´Ù. make_heap ÇÔ¼ö´Â first ~ last ±¸°£À» ÈüÀ¸·Î ¸¸µå´Âµ¥ ±¸°£³»¿¡¼­ Á¦ÀÏ Å« °ªÀ» ¼±µÎ·Î À̵¿½Ã۱⸸ ÇÏ¸é µÈ´Ù. ³»¸²Â÷¼øÀ¸·Î Á¤·ÄÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ù ¿ä¼Ò¸¸ ¾ÕÂÊÀ¸·Î À̵¿½ÃŰ¹Ç·Î Á¤·Äº¸´Ù´Â ÈξÀ ´õ ¼Óµµ°¡ ºü¸£´Ù.

push_heap ÇÔ¼ö´Â first ~ last ±¸°£À» ÈüÀ¸·Î ¸¸µå´Âµ¥ À̶§ first ~ last-1±îÁö´Â ÀÌ¹Ì ÈüÀ̾î¾ß ÇÑ´Ù. Áï, first ~ last-1 ¹üÀ§ÀÇ ¿ä¼Ò Áß¿¡´Â first°¡ Á¦ÀÏ Ä¿¾ß ÇÑ´Ù. push_heap ÇÔ¼ö´Â ¿ø·¡ÀÇ Èüº¸´Ù Çϳª ´õ È®ÀåµÈ ¹üÀ§ÀÎ first ~ last¸¦ ÈüÀ¸·Î ¸¸µå´Âµ¥ ÀÌ´Â °ð last¸¦ Æ÷ÇÔÇÏ¿© Á¦ÀÏ Å« °ªÀ» ¾ÕÀ¸·Î º¸³»´Â °ÍÀÌ´Ù. ±×·¡¼­ Åë»ó push_heap ÀÌÀü¿¡ push_backÀÌ ¸ÕÀú È£ÃâµÈ´Ù.

pop_heapÀº first¿¡ ÀÖ´Â Á¦ÀÏ Å« ¿ä¼Ò¸¦ Á¦ÀÏ µÚ·Î º¸³»°í ³ª¸ÓÁö first ~ last-1 ±¸°£À» ´Ù½Ã ÈüÀ¸·Î ¸¸µç´Ù. Áï, Á¦ÀÏ Å« °ªÀº ³¡À¸·Î Ãß¹æ½ÃŰ°í ³²Àº ¿ä¼Òµé Áß Á¦ÀÏ Å« °ªÀ» ´Ù½Ã ¼±µÎ·Î º¸³»´Â °ÍÀÌ´Ù. sort_heapÀº Èü ±¸°£À» ¿À¸§Â÷¼øÀ¸·Î Á¤·ÄÇϴµ¥ ÀϹÝÀûÀÎ Á¤·Ä ÇÔ¼öº¸´Ù´Â ÈξÀ ´õ ºü¸£´Ù.

 

¿¹ Á¦ : make_heap

#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;

 

template<typename C> void dump(const char *desc, C c) { cout.width(12);cout << left << desc << "==> ";

      copy(c.begin(),c.end(),ostream_iterator<typename C::value_type>(cout," ")); cout << endl; }

 

void main()

{

     int ar[]={5,3,2,9,6};

     vector<int> vi(&ar[0],&ar[5]);

     dump("¿øº»",vi);

     make_heap(vi.begin(),vi.end());

     dump("make_heap",vi);

     vi.push_back(10);

     push_heap(vi.begin(),vi.end());

     dump("push_heap",vi);

     pop_heap(vi.begin(),vi.end());

     dump("pop_heap",vi);

     vi.pop_back();

     sort_heap(vi.begin(),vi.end());

     dump("sort_heap",vi);

}

 

Á¤¼ö ´Ù¼¸ °³°¡ ÀúÀåµÈ º¤Å͸¦ ÈüÀ¸·Î ¸¸µé°í »õ ¿ä¼Ò¸¦ Çϳª ³Ö°í ¶Ç »© º¸±âµµ Çß´Ù. ±×¸®°í ¸¶Áö¸·À¸·Î ÈüÀ» Á¤·ÄÇϸ鼭 °¢ ´Ü°èÀÇ º¤Å͸¦ Ãâ·ÂÇØ º¸¾Ò´Ù.

 

¿øº»        ==> 5 3 2 9 6

make_heap   ==> 9 6 2 3 5

push_heap   ==> 10 6 9 3 5 2

pop_heap    ==> 9 6 2 3 5 10

sort_heap   ==> 2 3 5 6 9

 

make_heap¿¡ ÀÇÇØ vi º¤ÅÍ´Â ÈüÀÌ µÇ´Âµ¥ ´Ù¼¸ °³ÀÇ Á¤¼ö Áß °¡Àå Å« °ªÀÌ Á¦ÀÏ ¼±µÎ·Î À̵¿Çß´Ù. ³ª¸ÓÁö ¿ä¼Ò´Â ±»ÀÌ Á¤·ÄµÉ ÇÊ¿ä¾ø´Ù. »õ ¿ä¼Ò¸¦ Èü¿¡ Ãß°¡Çϱâ À§ÇØ push_backÀ¸·Î 10À» º¤ÅÍ¿¡ Ãß°¡Çϰí push_heapÀ¸·Î ÀÌ ¿ä¼Ò¸¦ Èü¿¡ Ãß°¡Çß´Ù. 10À» Ãß°¡Çϱâ Àü¿¡ 0~5±¸°£ÀÌ ÈüÀ̾ú´Âµ¥ push_heapÀº »õ·Î Ãß°¡µÈ 10±îÁö °í·ÁÇÏ¿© ÀÌ º¤Å͸¦ ´Ù½Ã ÈüÀ¸·Î ¸¸µç´Ù. ÀÌ °æ¿ì 10ÀÌ °¡Àå Å©¹Ç·Î ¼±µÎ·Î À̵¿ÇØ¾ß ÈüÀÌ µÈ´Ù. ¸¸¾à 8À» Ãß°¡Çß´Ù¸é 8ÀÌ ±»ÀÌ ¼±µÎ·Î À̵¿ÇÏÁö ¾Ê¾Æµµ µÉ °ÍÀÌ´Ù.

pop_heapÀº Èü¿¡¼­ Á¦ÀÏ Å« °ª, Áï ù ¹øÂ° ¿ä¼Ò¸¦ Á¦ÀÏ ¸¶Áö¸· ¿ä¼Ò¿Í ±³È¯Çϰí Á¦ÀÏ ³¡À» Á¦¿ÜÇÑ ³ª¸ÓÁö ±¸°£À» ÈüÀ¸·Î ¸¸µç´Ù. 10ÀÌ ¹Ð·Á³ª°í ³²Àº ¿ä¼Òµé Áß Á¦ÀÏ Å« °ªÀÌ Ã³À½À¸·Î ¿À°Ô µÉ °ÍÀÌ´Ù. pop_backÀº first ~ last-1¸¸ ±¸°£À¸·Î ¸¸µé »ÓÀ̹ǷΠÀÌ ¹éÅÍÀÇ Àü ±¸°£ÀÌ ÈüÀÌ µÇ·Á¸é ¹Ð·Á³­ 10À» pop_back µîÀÇ ÇÔ¼ö·Î »èÁ¦ÇØ¾ß ÇÑ´Ù. sort_heapÀº ÈüÀ» ¿À¸§Â÷¼øÀ¸·Î Á¤·ÄÇÑ´Ù.

Èü ¿¬»êÀº ¿ì¼± ¼øÀ§ Å¥°°Àº ÀÚ·á ±¸Á¶¸¦ ±¸ÇöÇϱâ À§ÇÑ ¿¬»êÀÌ´Ù. ÀÌ·± ÀÚ·á ±¸Á¶¸¦ ±¸ÇöÇϱâ À§Çؼ­´Â Á¦ÀÏ Å« °ª Çϳª¸¸ »© ³»±â ½¬¿î À§Ä¡¿¡ ÀÖ°í »õ·Î¿î °ªÀÌ Ãß°¡ µÇ°Å³ª Á¦ÀÏ Å« °ªÀÌ ºüÁ® ³ª°¥ ¶§ Á¦ÀÏ Å« °ªÀ» ¹Ì¸® ã¾Æ ³õ±â¸¸ ÇÏ¸é µÈ´Ù. ÀÌ Á¤µµ ¿ä±¸ »çÇ×À» ÃæÁ·Çϱâ À§Çؼ­´Â ±»ÀÌ ±× ºñ½Ñ Á¤·ÄÀ» ¸Å¹ø ÇÒ Çʿ䰡 ¾øÀ¸¸ç ¸î ¹øÀÇ ±³È¯¸¸ ¼öÇàÇÏ¸é µÈ´Ù. »ç½Ç Èü ¿¬»êÀº ÃÖÁ¾ »ç¿ëÀÚµéÀÌ ¾µ¸¸ÇÑ ¿¬»êÀº ¾Æ´Ï¸ç ½Ç¿ë¼ºµµ ³·´Ù.