次ã®ãããªé åãœãŒãã¢ã«ãŽãªãºã ãå¿ èŠãªå ŽåïŒ
- OïŒN * logïŒNïŒïŒæäœïŒäº€æãšæ¯èŒïŒã«å¯ŸããŠä¿èšŒãããåäœãããŸãã
- OïŒ1ïŒã®è¿œå ã¡ã¢ãªãå¿ èŠã§ãã
- å®å®ããŸãïŒã€ãŸããåãããŒãæã€èŠçŽ ã®é åºã¯å€æŽãããŸããã§ããïŒ
ãã®å Žåãããã3ã€ã®ãã€ã³ãã®ãã¡ã®ãããã2ã€ã«å¶éããããææ¡ãããŸãã ãŸããéžæã«å¿ããŠãããšãã°ã ããŒãžãœãŒã ïŒOïŒNïŒè¿œå ã¡ã¢ãªãå¿ èŠïŒã ãã©ããããœãŒã ïŒäžå®å®ïŒããŸãã¯ããã«ãœãŒã ïŒOïŒN 2 ïŒã§æ©èœããŸãïŒãååŸããŸãã ã¡ã¢ãªèŠä»¶ãOïŒlogïŒNïŒïŒïŒãååž°ãïŒã«åŒ±ããå Žåãè€éãOïŒN *ïŒlogïŒNïŒ 2 ïŒã®ã¢ã«ãŽãªãºã ããããŸã -å®è£ ã§ã¯äœ¿çšãããŠããããŒãžã§ã³ã§ãããã»ãšãã©ç¥ãããŠããªãã¡ãœããstd :: stable_sortïŒïŒã
3ã€ã®æ¡ä»¶ãã¹ãŠãåæã«éæããããšãå¯èœãã©ãããå°ãããããšãã倧åã¯ãã»ãšãã©ããšèšããŸããã ãŠã£ãããã£ã¢ã¯ãã®ãããªã¢ã«ãŽãªãºã ã«ã€ããŠç¥ããŸããã ããã°ã©ããŒã®éã§ã¯äœããååšããŠããããã ãšããåããããŸãã ãå®å®ããã¯ã€ãã¯ãœãŒããããããšèšã人ãããŸãããç§ãèŠãå®è£ ã¯åãOïŒN *ïŒlogïŒNïŒ 2 ïŒïŒã¿ã€ããŒïŒã®è€éããæã¡ãŸãããStackOverflowã«é¢ãã1ã€ã®è°è«ã§ã®ã¿ãªã³ã¯ãäžããŸããã BCãHuang and MA Langstonã®èšäºã3ã€ã®ããããã£ãã¹ãŠãåããã¢ã«ãŽãªãºã ã説æããã å®æ°ãšã¯ã¹ãã©ã¹ããŒã¹ã§ã®é«éå®å®ããŒãžããã³ãœãŒã ïŒ1989-1992ïŒãåç §ããŠãã ããã
èè ã¯ã圌ãã®ã¢ã«ãŽãªãºã ãæåã§ã¯ãªããšèšãã LãTrabb Pardoã®äœåã 1974幎ã®æé©ãªç©ºéãšæéã®å¢çã§ã®å®å®ãããœãŒããšããŒãžãåç §ããŸãã ããã¯çŽ80ããŒãžã®ã¹ãã£ã³ãããããã¹ãã§ãããç§ã¯ãããç解ããããšããŸããã§ããã
HuangãšLangstonã®èšäºãç解ããããšãã人ã ã®ããã«ãããã«èšè¿°ãããŠãã圢åŒã§ã¢ã«ãŽãªãºã ãå®è£ ã§ããªãã£ãããšãããã«èšããªããã°ãªããŸããã 4.3ç¯ã§äœ¿çšããææ³ã¯æ©èœããŸããã ãã€ãŸãã2çªç®ã®ãµããªã¹ãã·ãªãŒãºã®å³ç«¯ã®ãããã¯ã®å é ã«ã¯ããã®ããåã®ã¬ã³ãŒãã®ããŒãããå³å¯ã«å€§ããããŒãäžæçã«ãããšããããšã§ããæ£ãããã¯å¿ ãããçå®ã§ã¯ãããŸããã 幞ããªããšã«ãåŸã®ããã€ãã®äœåã§ãã®åé¡ãåé¿ããæ¹æ³ãèŠã€ããããšãã§ããŸããããããŠã3ã€ã®æ¡ä»¶ããã¹ãŠæºããã¢ã«ãŽãªãºã ãå®éã«ååšãããšèšãããšãã§ããŸãã
ããã§ã¯å§ããŸããã...
åºæ¬æäœ
é åãæäœããã«ã¯ãé¢æ°ãå¿ èŠã§ãã
- SWAP1ïŒAãBïŒ-2ã€ã®èŠçŽ ã亀æããŸãã é£æ床ã¯1ã§ãã
- SWAPNïŒAãBãKïŒ -é åAãšBã®èŠçŽ ã®Kãã¢ã亀æããŸããè€éãã¯Kã§ãã
- ROTATEïŒAãKãLïŒ -é åAã®2ã€ã®é£ç¶ãããã©ã°ã¡ã³ããåé 眮ããŸããæåã®é·ãã¯Kã2çªç®ã®é·ãã¯Lã§ããè€éãã¯K + Lãè¶ ããŸããã
- BinSearchLeftïŒXãAãLïŒ -èŠçŽ Xãé·ãLã®é åºä»ãé åAã«æ¿å ¥ããæãå·Šã®å ŽæãèŠã€ããŸããæå¹ãªçµæã¯0ãLã§ããé£æ床ã¯logïŒLïŒã§ãã
- BinSearchRightïŒXãAãLïŒ -èŠçŽ Xãé·ãLã®é åºä»ãé åAã«æ¿å ¥ããæãå³ã®å ŽæãèŠã€ããŸããçµæã®æå¹ãªå€ã¯0ãLã§ããé£æ床ã¯logïŒLïŒã§ãã
亀æçšã®ã¯ãªããããŒããæ¢ããŠããŸãã
æåã«å°ãçšèªã説æããŸãã
æ¯èŒé¢æ°ã«ãã£ãŠçãããšããçµæãåŸãããèŠçŽ ã«ã€ããŠã¯ãç©ççã«ã¯ããŒãååšããªããŠããåãããŒãæã£ãŠããããšèšããŸãã ãããã£ãŠãé åå ã®ç°ãªãããŒã®æ°ãšç°ãªãããŒãæã€èŠçŽ ã決å®ã§ããŸãã
åãããŒãæã€èŠçŽ ãåãé åºã«ããââå Žåãé åã®2ã€ã®ç¶æ ã¯åçãšåŒã°ããŸãã å®å®ããã€ã³ãã¬ãŒã¹ãœãŒãã®äž»ãªåé¡ã¯ããã®ç䟡æ§ã倱ããªãããšããŸãã¯åžžã«åŸ©å ã§ããããšã§ãã
é åã®é·ããNã«ããŸããN<16ã®å Žåããã®ãããªé åã¯ãœãŒãããŸãããã代ããã«æ¿å ¥ã䜿çšããŠãœãŒããåŒã³åºããŸããããã¯ãäžè¬çãªæŒžè¿åäœã«åœ±é¿ããŸããã
sqrtã«è¿ã2ã®ã¹ãä¹ïŒNïŒã«çããæ°SãéžæããŸãã K = [N / S]ãå®çŸ©ããŸãã ãããŠãK + Sé åã§ãã¢ããšã«ç°ãªãããŒãèŠã€ããŠã¿ãŠãã ããã
æåã®ã¢ã€ãã¢ã¯ãåããŒã«ã€ããŠãã®ããŒãæã€é åã®å·Šç«¯ã®èŠçŽ ãååŸããé åã®å é ã§ãã®ãããªãã¹ãŠã®èŠçŽ ãåéãããšïŒæ®ãã®èŠçŽ ã®é åºãä¿æããïŒãç䟡æ§ã¯å£ããªãããããã¯ç§ãã¡ã«ã¹ããŒã¹ãäžãããšããããšã§ãèŠçŽ ãèªç±ã«åé 眮ããŠæ¯èŒã§ããŸãã
æ€çŽ¢ããã»ã¹ã§ã¯ãé åã®é£ç¶ãã©ã°ã¡ã³ãã§èŠã€ãã£ãããŒãä¿æããæ°ããããŒãèŠã€ãã£ããšãã«åæ¹ã«ç§»åããŸããé åã®èŠçŽ ããœãŒãããèŠã€ãã£ãããŒã®ãã©ã°ã¡ã³ãã§ãã€ããªæ€çŽ¢ã§æ€çŽ¢ããèŠã€ãããªãå Žåã¯ãROTATEã§1ã€ã®é åã«é©åãããŸãèŠã€ãã£ãèŠçŽ ãžã®ããŒããããŠ2çªç®ã®èŠçŽ -ãã®ãã©ã°ã¡ã³ãã®é©åãªå Žæã«æ°ããèŠçŽ ãé 眮ããŸãã
ããŒã¯æé ã§åéããããããçŸåšã®èŠçŽ ãšåãããŒãæã€èŠçŽ ã«æ¢ã«ééãããã©ããã確èªããæéãç¯çŽã§ããŸãã ããŒã䜿çšãããã©ã°ã¡ã³ãã®ç§»åæ°ã¯ãèŠã€ãã£ãããŒã®æ°ããã倧ãããªãããããã®ã¹ãããã®è€éãã¯ãææªã®å ŽåãN * logïŒNKeysïŒæ¯èŒãš2 * N + NKeys 2亀æã§ãã NKeys以æ¥ãçŽ2 * sqrtïŒNïŒãããŸããããããŸã§ã®ãšããæµ·å€ã«è¡ã£ãŠããŸããã
çŸåšã2ã€ã®ãªãã·ã§ã³ããããŸãã é åºä»ããããK + SããŒãèŠã€ãã£ãããèŠã€ãããŸããã§ããã ãããã®ã±ãŒã¹ã®åŠçæ¹æ³ã¯ãããã«ç°ãªããŸãã ããã«ãç°ãªãããŒã®æ°ã4æªæºã®å ŽåããããŸãããããç¬èªã®åŠçãæã£ãŠããŸãã
ã±ãŒã¹A.å€ãã®ç°ãªãããŒããããŸãã
é åã®æåã«åéãããããŸããŸãªããŒã®K + SããããŸãã ãããã®æåã®Kãããã©ã°ã¡ã³ããããŒã¯ããããã®ããŒããšå®£èšããä»ã®ãšããã¯è§ŠããŸããã æ®ãã®Sã¯ããŒãžãããã¡ã«ãªããŸãã å ã®é åã®æ®ãã®èŠçŽ ã¯ãã¹ãŠãããŒã¿ãã§ãããçŸåšã¯é åã®æåŸã«ãããŸãã
A.1ã å€å žçãªããŒãžãœãŒãã¹ããŒãžã
ããã«2ã€ã®é¢æ°ãäœæããŸãã 1ã€ã¯MergeLeftããã1ã€ã¯MergeRightãšåŒã°ããŸãã ãããã«ã¯ã3ã€ã®éšåã§æ§æãããé åã®ãã©ã°ã¡ã³ããäŸçµŠãããŸãã MergeLeftã®å Žåãããã¯é·ãPã®ãããã¡ãŒãé·ãQã®ãœãŒãæžã¿ãã©ã°ã¡ã³ããããã³é·ãRã®ãœãŒãæžã¿ãã©ã°ã¡ã³ãã§ãïŒSâ¥RïŒã ãã®é¢æ°ã¯ã2çªç®ãš3çªç®ã®ãã©ã°ã¡ã³ããããŒãžããçµæãå é ã«é 眮ãããããã¡ãŒèŠçŽ ããã®ãã©ã°ã¡ã³ãã®æ«å°Ÿã«ã©ã³ãã ãªé åºã§é 眮ããå¿ èŠããããŸãã MergeRighté¢æ°ã¯é¡ã®ããã«æ©èœããŸããå ¥åã«ã¯2ã€ã®ãœãŒãããããã©ã°ã¡ã³ããããããã®åŸã«ãããã¡ãç¶ããåºåã«ã¯éã«ããããã¡ã«ç¶ããŠãœãŒãããããã©ã°ã¡ã³ãããããŸãã 次ã®ããã«ãªããŸãã
äž¡æ¹ã®æ©èœã®è€éãã¯ãæ¯èŒãšäº€æã®äž¡æ¹ã§Q + Rãè¶ ããŸããã
MergeLefté¢æ°ã䜿çšãããšãæåã«ãã¢ã§ã次ã«4ã§ãæ倧é·Sã®ãã©ã°ã¡ã³ããŸã§ããŒã¿ããœãŒãã§ããŸãïŒSã¯2ã®ã¹ãä¹ã§ããããšãæãåºããŸãïŒã MèŠçŽ ããœãŒããããã³ã«ãé·ãM / 2ã®ãããã¡ãŒã䜿çšããŸãããã®çµæãé åã®å³åŽã«æ®ããŸãã ãã¢ã䞊ã¹æ¿ãã段éã§ã¯ãé·ã2ã®ãããã¡ãŒã䜿çšããŸãããã®ããã䞊ã¹æ¿ããããæçã®é·ããSã«ãªããŸã§ã«ãããŒã¿é åãå·Šã«æŒããããããã¡ãŒèŠçŽ ã®Sãå³åŽã«ãªããŸãã ããã§ãMergeRightã䜿çšããŠãé·ã2 * Sã®ãã©ã°ã¡ã³ãããœãŒãããåæã«ãããã¡ãŒãå é ã«æ»ãããšãã§ããŸãã
A.2ã ãããã¯ãœãŒãã¹ããŒãžã
ããã§ãé·ãG = 2 * Sã®ãã©ã°ã¡ã³ãããœãŒããããŸããã ããŒã¿é åå šäœã®ãµã€ãºã«éãããŸã§ããããããã¢ã§ããŒãžãã次ã«ãã¢ã§ããŒãžããŸãã ãããè¡ãã«ã¯ãé·ãSã®ãããã¡ãŒãšãé·ãKã®ããŒãæã€é åããããŸããããã§ãKâ€L / SïŒLã¯ããŒã¿é åã®å šé·ã§ãïŒã
ãããã£ãŠããµã€ã¯ã«ã¯ãwhile Gâ€Lãã§ãã
é·ãGã®2ã€ã®é£ç¶ãããã©ã°ã¡ã³ããããŒãžãããããã®çŽåã«é·ãSã®ãããã¡ãŒããããŸãïŒGãšSã¯2ã®ã¹ãä¹ã§ãïŒã ãã©ã°ã¡ã³ããé·ãSã®ãããã¯ã«åå²ããŸããããããK 1ããåãåºããŸãã é åã®æåŸã®2çªç®ã®ãã©ã°ã¡ã³ãã®é·ãã¯Gæªæºã§ããå¯èœæ§ããããåå²åŸãããããäžå®å šãªãããã¯ãæ®ãå ŽåããããŸãïŒèšç®ã¯è¡ããŸããïŒã æåã®K 1ããŒïŒå ã®é åã®å é ã«ããïŒãååŸããããããïŒããšãã°ãæ¿å ¥ã«ãã£ãŠïŒäžŠã¹æ¿ããããŒã®ã€ã³ããã¯ã¹ãG / Sã®æ°åã§èŠããŸãïŒçŸåšã¯G / Sã§ãããå€æŽãããŸãïŒ-ãããããŒãšåŒã³ãŸãããã åããŒã«ã¯ç¬èªã®ãããã¯ããããŸãã ãããã䜿çšããŠãæåã«ããŒãžãããæåã®ãã©ã°ã¡ã³ããš2çªç®ã®ãã©ã°ã¡ã³ããåºå¥ãã2çªç®ã«åäžã®èŠçŽ ãæã€ãããã¯ã®é åºãç¶æããŸãã ä»ã¯æããããã®ãšããŠæ··ããããã§ãã
ãããã¯ã䞊ã¹æ¿ããŸãã é åºã¯æåã®èŠçŽ ã«ãã£ãŠæ±ºå®ãããããããçããå Žåããããã®ãããã¯ã«å¯Ÿå¿ããããŒã ããã§äœ¿çšã§ããå¯äžã®äžŠã¹æ¿ãã¯ãK 1åã®äº€æïŒããã³K 1 2/2ã®æ¯èŒïŒããå¿ èŠãšããªããããæå°èŠçŽ ã®éžæã«ãã䞊ã¹æ¿ãã§ãã2ã€ã®ãããã¯ã®äº€æã¯é«äŸ¡ãªæé ã§ãããSã¯çŽsqrtïŒNïŒ ããã®åŸããœãŒãæé å šäœãOïŒNïŒæäœã«é©åããŸãã 2ã€ã®ãããã¯ãåé 眮ãããšãããããããŒããŒã«åŸãããšãå¿ããã«ããããã«å¯Ÿå¿ããããŒãåé 眮ããŸãã ãã®ãœãŒãã§äžå®å šãªãããã¯ïŒããå ŽåïŒã«ã¯è§ŠããŸããïŒ
以åã«æåã®ãã©ã°ã¡ã³ãã«å±ããŠãããããã¯ã¯æåAã§ç€ºããã2çªç®ã«å±ãããããã¯ã¯æåBã§ç€ºãããŸãããœãŒãã§ã¯ãåãã©ã°ã¡ã³ãã«å¯Ÿå¿ãããããã¯ã®é åºã
ä¿åãããŸãã
äžå®å šãªãããã¯ã¯åžžã«ãã©ã°ã¡ã³ãBã«å±ããŸãããã®åã®ãããã¯ãèŠãŠããã®åã«æ¿å ¥ãããããã¯ãèŠã€ããŸãã åé ã«æ¿å ¥ãããããã®ãŸãŸã«ããŠããå¿ èŠãããå¯èœæ§ããããŸããã¢ã«ãŽãªãºã ã§ã¯ããããã®ã±ãŒã¹ã«ã¯ç¹å¥ãªæ³šæãå¿ èŠã§ãã 次ã®æ®µéã§ã¯ã移åãããããã¯ã«ã¯è§ŠããŸããïŒãããã¯ãã¹ãŠãã©ã°ã¡ã³ãAããã®ãã®ã§ãïŒã
ããã§ã¯ããããã¯ã®ããŒãžãå§ããŸãããã ããããç¶æ³ã¯æ¬¡ã®ããã«ãªããŸãã
- ãŸããç¹å®ã®æ°ã®å®å šã«ããŒãžããããããã¯ããããŸããããã®ãããã¯ã«ã€ããŠã¯ãã觊ããŠããŸããã
- 次ã«ã次ã®ãããã¯ã®ããã€ãã®èŠçŽ ïŒTãå Žåã«ãã£ãŠã¯T = 0ïŒãæ¢ã«é 眮ãããŠããŸãã
- 次ã«ãSãããã¡èŠçŽ
- 次ã«ãå ŽæããŸã 決å®ãããŠããªãSTèŠçŽ ã ãããã¯ãã¹ãŠ1ã€ã®ãã©ã°ã¡ã³ãAãŸãã¯Bã«å±ããã©ã®ãã©ã°ã¡ã³ãããããããŸãã
- 次ã«ã察å¿ããããŒãšãããããŒãæ¯èŒããããšã§å€å¥ã§ããã¿ã€ãã®çãããã¯ãæ¥ãŸãã
次ã®ããã«ãªããŸãã
ããã§ãA // Bã¯äžŠã¹æ¿ããããã»ã¯ã·ã§ã³ãA1ã¯æªå®æã®ãããã¯ãA2ãA3ãB2ã¯æªåŠçã®ãããã¯ãB3ã¯æåŸã®äžå®å šãªãããã¯ã§ãïŒA2ãŸãã¯A3ã®åã®å®éã®å ŽæïŒã
æåã¯ãããŒãžããããããã¯ã¯ãããŸãããT = 0ãããã³ãããã¡ãŒã®åŸã«æ¥ãSTèŠçŽ ã®ã¿ã€ãã¯ãæåã®ããŒã«ãã£ãŠæ±ºå®ãããŸãã
次ã®ãããã¯ãåŠçããã«ã¯ãå¥ã®SmartMergeLefté¢æ°ãèšè¿°ããå¿ èŠããããŸãïŒãããŠæåŸã§ã¯ãããŸããïŒïŒã MergeLeftãšåæ§ã«ãå ¥åã§ãããã¡ãš2ã€ã®ãã©ã°ã¡ã³ããåãåããŸãããããã®ãã©ã°ã¡ã³ãã®é åºã¯æ£ãããªãå ŽåããããŸãïŒããŒãžæã«ã¯ãèŠçŽ ãçããå Žåã2çªç®ã®ãã©ã°ã¡ã³ãããèŠçŽ ãååŸããå¿ èŠããããŸãïŒã é¢æ°ã¯ãäž¡æ¹ã®ãã©ã°ã¡ã³ãã空ã§ãªããªããŸã§èŠçŽ ãåé 眮ããå¿ èŠããããŸãã ãããã®1ã€ãçµäºãããšããã«ãä»ã®ãã©ã°ã¡ã³ãã®æ®ãã®èŠçŽ ãæåŸã«è»¢éãïŒ2çªç®ã®ãã©ã°ã¡ã³ããããæ©ãçµäºããå ŽåïŒããããã®æ°ãšããããå«ãŸããŠãããã©ã°ã¡ã³ããå ±åããå¿ èŠããããŸãã
ãã®ãããªãã®ïŒ
æåã®å ŽåãBã®èŠçŽ ã¯æåã«çµäºããæåŸã«Aã®æåŸã®èŠçŽ ãæ®ãã2çªç®ã®å Žåããã®éãåæ§ã§ãã
ãã®é¢æ°ã䜿çšãããšã1ãããã¯ãç°¡åã«é²ããããšãã§ããŸãã 次ã®ãããã¯ã®ã¿ã€ããæåŸã®æªåŠçã®èŠçŽ ãšåãå Žåããããã¡ãŒã§ããããå€æŽããT = 0ãšèšããæ°ãããããã¯ã¯æªåŠçã§ãïŒç¶æ³ã¯æåãšåãã§ãïŒã ã¿ã€ããç°ãªãå ŽåãSmartMergeLeftãåŒã³åºãã圌女ã¯èªåã§ãã¹ãŠãå®è¡ããŸãããããã¯ã®æåŸã«æ®ããåŠçãããªãèŠçŽ ã§ãã
ãããã£ãŠããããã¯ã䞊ã¹æ¿ãããšããã©ã°ã¡ã³ãBã®æåŸããäžå®å šãªãããã¯ãååšããæåŸãŸãã¯å Žæã«å°éããŸããããã§ããã€ãã®ãªãã·ã§ã³ããããŸãã
ãŸãã¯ãæåŸã®æ®ãã®æªå å·¥èŠçŽ ã¯ãã©ã°ã¡ã³ãBããã®ãã®ã§ãããããã®èŠçŽ ã®æåŸã¯ãåŸç¶ã®ãããã¯Aã®æåã®èŠçŽ ïŒååšããå ŽåïŒããå°ãããæªå å·¥èŠçŽ ããããã¡ãšå®å šã«äº€æã§ããŸãã
ãŸãã¯ããããã®èŠçŽ ã¯ãã©ã°ã¡ã³ãAããã®ãã®ã§ãã次ã«ããããã®èŠçŽ ãåŸç¶ã®ãããã¯ã«ä»®æ³çã«è²Œãä»ããŸãïŒç¹°ãè¿ããŸãïŒã
ã©ã¡ãã®å Žåããåãç¶æ³ã«ãªããŸãããããã¡ãŒã«ç¶ããŠãã©ã°ã¡ã³ãAã®èŠçŽ ãç¶ãããã©ã°ã¡ã³ãBã®èŠçŽ ã¯Sã ãã§ããMergeLefté¢æ°ã®æºåå®äºç¶æ ã ç§ãã¡ã¯ãããåŒã³åºããŸã-ãããŠããã©ã°ã¡ã³ãã¯ããŒãžããããããã¡ã¯ãããã®åŸã«ãããŸãã
ããŒã¿é åã®æåŸã«å°éãããŸã§ãé·ãGã®ãã©ã°ã¡ã³ãã®ãã¹ãŠã®ãã¢ã«å¯ŸããŠãã®æé ãå®è¡ããŸãã 次ã«ããã¹ãŠã®ããŒã¿ãSèŠçŽ ã ãå³ã«ã·ãããïŒãããã¡ãŒãå é ã«æ»ããŸãïŒãSã®å€ã2åã«ããŸãã
ãµã€ã¯ã«ã®çµããã
A.3ã å®äºã
ãœãŒããããããŒã¿ã®é åãååŸããŸããããã®åã«ãå é ã«ããããŒãã©ã³ãã ã«èŠã€ãããŸãã ãããããœãŒããïŒæ¿å ¥ã䜿çšïŒãè¿œå ã®ãããã¡ãŒã䜿çšããã«2ã€ã®ãœãŒãæžã¿ãã©ã°ã¡ã³ããããŒãžããå¿ èŠããããŸãã ä»åã¯ããã®ãã¡ã®1ã€ãéåžžã«çãã§ãã
MergeWithoutBufferé¢æ°ã¯ãé·ãPãšQã®2ã€ã®ãœãŒãããããã©ã°ã¡ã³ããå ¥åãšããŠåãåããŸãã æåã®ãã©ã°ã¡ã³ãã®æåã®èŠçŽ ã¯2çªç®ã®ãã©ã°ã¡ã³ãã®æåã®èŠçŽ ãã倧ãããããŸããããPã1æžãããŠããã©ã°ã¡ã³ãã®å é ãå³ã«ã·ããããŸãã PããŒãã«éãããšãåã¡ãŸããã ãã以å€ã®å ŽåãBinSearchLeftã䜿çšããŠã2çªç®ã®ãã©ã°ã¡ã³ãã®æåã®èŠçŽ ã®æ£ããäœçœ®kãèŠã€ããROTATEã䜿çšããŠã2çªç®ã®ãã©ã°ã¡ã³ãã®æåã®ãã©ã°ã¡ã³ããšæåã®kèŠçŽ ãå€æŽããŸãã Qãkæžããããã©ã°ã¡ã³ãã®å é ã移åããŸãã QããŒãã«éãããšãé¢æ°ãå®è¡ãããŸãããã以å€ã®å Žåã¯ãæåããç¹°ãè¿ããŸãã ãã®é¢æ°ã®è€éãã¯P ^ 2 + Qã§ãã ãœãŒã¹ãPâ¥Qã®å Žåãåãããšãè¡ããŸããããã©ãŒé ã§ãã
䞊ã¹æ¿ããå®äºããã«ã¯ãMergeWithoutBufferïŒArrãK + SãNKSïŒãåŒã³åºããŸãã ãã¹ãŠæºåå®äºã§ãã
ã±ãŒã¹Bãç°ãªãããŒã¯ã»ãšãã©ãããŸãããã3ã€ä»¥äžãããŸãã
ãã®ç¶æ³ã§ã¯ããããã¡ãŒãšããŒã«åæã«å ŽæããããŸãããããããé çªã«äœ¿çšããŸãã ç°ãªãããŒã®åèšãMã§ãããšããŸããKã§Mãè¶ ããªã2ã®æ倧次æ°ã瀺ããKã®ããŒïŒé åã®å é ã«ããïŒãä¿æãããšãæ®ãã®ããŒã¿ã¯ç©ºã«ãªããŸãã
B.1ã å€å žçãªããŒãžãœãŒãã¹ããŒãžã
ãã®ã¹ããŒãžã¯A.1ãšå€ãããŸãããé·ãSã®ãããã¡ãŒã®ä»£ããã«ãé·ãKã®ããŒã®é åã䜿çšããŸãïŒããã¯2ã®ã¹ãä¹ã§ãïŒã é åãååŸã«æ©ããšãé·ãG = 2 * Kã®ãœãŒãããããã©ã°ã¡ã³ããåŸãããŸãã
B.2ã ãããã¯ãœãŒãã¹ããŒãžã
é·ãGã®ãã©ã°ã¡ã³ãããã§ã«ããŒãžãããŠããããããããã¢ã§çµåãããšããŸãã ãããã¡ããªãããããããã¯ãµã€ãºãèªåã§éžæã§ããŸãã ãããã¯ãããŒã¯ããããã®ããŒã®æ°ã¯Kãè¶ ããŸãããK1 = minïŒKãK 2 ïŒããšããŸããããã§ãK 2ã¯ïŒ2 * G * MïŒ 1/3ã«æãè¿ã2ã®ã¹ãä¹ã§ãïŒMã¯ç°ãªãæ°é åå ã®ããŒïŒã ãããã¯ãµã€ãºã¯S = 2 * G / K 1ã«ãªããŸãã
A.2ãšåãæ¹æ³ã§ããŒãšãããã¯ããœãŒãããŸãã ããã«ã¯ãããã¡ãŒã¯å¿ èŠãããŸããã
次ã«ãé åã調ã¹ãŠãããã¯ãããŒãžããå¿ èŠããããŸãã MergeWithoutBufferãšSmartMergeLeftã®ãã€ããªããã§ããSmartMergeWithoutBufferé¢æ°ãäœæããŸãããã æåã®ãã©ã°ã¡ã³ãã2çªç®ã®ãã©ã°ã¡ã³ããããçããšæ³å®ããŠããŸãã MergeWithoutBufferãšåãããã«æ©èœããŸããããã©ã°ã¡ã³ãã®é åºãééã£ãŠããå¯èœæ§ãããããšãèæ ®ããããã«ãé åã®æåŸã«æ®ã£ãŠããèŠçŽ ãšãã©ã°ã¡ã³ãã®æ°ãå ±åããŸãã SmartMergeLeftã®ä»£ããã«ãã®é¢æ°ãåŒã³åºããæåŸã«MergeLeftã®ä»£ããã«MergeWithoutBufferé¢æ°ãåŒã³åºããšããã©ã°ã¡ã³ããããŒãžãããŸãã
ããã§å€±ãããããã«èŠããŸã-ææªã®å Žåã®æ倧ãããã¯é·ïŒK = 4ãG = N / 2ïŒã¯N / 4ã§ããããã¯ãSmartMergeWithoutBufferé¢æ°ãOïŒN ^ 2ïŒæäœãå¿ èŠãšããå¯èœæ§ãããããšãæå³ããŸãã ããããé åå ã®ç°ãªãããŒã®æ°ãå°ãªãããšãç¯çŽã§ããŸããSmartMergeWithoutBufferã®è€éããP * m + Qãè¶ ããªãããšã瀺ãããšãã§ããŸããããã§ãmã¯æåã®ãã©ã°ã¡ã³ãã®ç°ãªãããŒã®æ°ã§ãã ãããŠãé·ãGã®æçã®ãã¹ãŠã®K / 2ãããã¯ã®ç°ãªãããŒã®æ°ã®åèšïŒæ·±åŒåžããŠåèªãã-ç§ã¯ãããç°¡åã«å®åŒåããããšã¯ã§ããŸããïŒã¯K / 2 + Mãè¶ ããªãã®ã§ãé·ãGã®2ã€ã®æçã®ããŒãžã¯OïŒGïŒæäœã
B.3ã å®äºã
ãã®æé ã¯A.3ãšå€ãããŸããã
ã±ãŒã¹Cã3ã€ä»¥äžã®ç°ãªãããŒã¯ãããŸããã
ããã§ã¯ãéåžžã®ããŒãžãœãŒãïŒååž°ãªã-2ã4èŠçŽ ãªã©ã§ãœãŒãïŒãèšè¿°ãããã©ã°ã¡ã³ããããŒãžããã«ã¯MergeWithoutBuffersã䜿çšããŸãã é åã«ã¯ç°ãªãããŒãã»ãšãã©ãªãããããã®è€éãã¯ãããŒãžããããã©ã°ã¡ã³ãã®é·ãããç·åœ¢ã«ãªããŸããã€ãŸããå šäœçãªè€éãã¯OïŒN * logïŒNïŒïŒã«ãªããŸãã
å®è£ ãšçµè«ã
å®è£ ã¯åä»ã§ããããšãå€æããŸãã-C ++ã§ã»ãŒ400è¡ã§ã ïŒå®éãCã§æžãããŠããŸã-å€æ°ã®èª¬æãé¢æ°ã®å é ã«è»¢éããã ãã§ãïŒã æäœã®é床ã¯ã±ãŒã¹AãšBã§å€§ããç°ãªããŸããææªã®ç¶æ³ã¯ãå€ãã®ç°ãªãããŒãããå Žåã§ãããã±ãŒã¹Aã«é²ãå¿ èŠãããå Žåãããå°ãå°ãªããªããŸãããã®ç¶æ³ã§ã¯ãã¢ã«ãŽãªãºã ã¯ã±ãŒã¹AããçŽ3åé ããªããŸãã ãã ããè€éãã®æšå®å€N * logïŒNïŒã¯ä¿æãããŸãã
倧ããªé åïŒçŽ1,000äžåïŒã§ã¯ãã¢ã«ãŽãªãºã ã¯ã»ãšãã©åžžã«ïŒéåžžã«å°æ°ã®ç°ãªãããŒã®å Žåãé€ãïŒInPlaceStableSortïŒOïŒN * logïŒNïŒ 2 ïŒã®åŸãã«ãããã®ïŒãããåªããŠããŸãã ãããã圌ã¯std :: stable_sortãšç«¶åããããšã¯ã§ããŸããïŒå°ãªããšãåžžã«ã¡ã¢ãªãããããã®å Žåstd :: stable_sortã¯éåžžã®MergeSortã«ãã°ããåãæ¿ãããquicksortãå«ããã¹ãŠã®äººãç°¡åãã€ç¡æ¡ä»¶ã«è¿œãè¶ããŸã:)ã ãã®ãããå®è£ ãããã¢ã«ãŽãªãºã ã«ã¯çè«çãªæå³ãããããŸããã
ããããããã§ãååšããŸã:)
PSæåã®åçã¯ãããªã³ã¹ãã³å€§åŠã®ã¢ã«ãŽãªãºã ãšããŒã¿æ§é ãRãSedgewickã«ããè¬çŸ©ã³ãŒã¹ã®ã¹ã©ã€ãã§ãã2010幎æ¥
æŽæ°ïŒã¹ããŒãžB2ã¯å€§å¹ ã«å éã§ããŸãã æ°Gã¯ååå°ããã§ãããïŒK / 2ïŒ^ 2> = 2 * Gãçºçããå¯èœæ§ããããŸãã ãã®å ŽåãããŒã®ã»ãããååã«åå²ããååãã¯ãªããããŒããšããŠïŒããã³æ®ãã®ååãããŒãšããŠïŒäœ¿çšããA2ã®é«éã¡ãœããã䜿çšããŠãã©ã°ã¡ã³ããããŒãžã§ããŸãã ãããŠãGãé åã®ãµã€ãºã«è¿ã¥ããšãæåŸã«ãããã¡ãŒãªãã®äº€æã«åãæ¿ããŸãã
ããŒã®çš®é¡ãå€ããã°å€ãã»ã©ããããã¡ãªãã®ããŒãžã¯é·ããªããŸããããããã¡ãªãã§å®è¡ã§ããæéã¯é·ããªããŸãã
å®éšã§ã¯ãææªã®å Žåãã¢ã«ãŽãªãºã ã¯1.61 * N * log 2 Nã®æ¯èŒãš2.12 * N * log 2 Nã®äº€æïŒNâ€1000000ã®å Žåãæå®æ°ã®ç°ãªãããŒãæã€ã©ã³ãã ããŒã¿ïŒãå¿ èŠãšããŸããã