今回はPattern-defeating Quicksortの論文を読んでいき、Goでどのように実装されているか簡単に見ていく
(PͰ࠾༻͞Εͨ1BUUFSOEFGFBUJOH2VJDLTPSUͷհ)JSPNV/BLBNVSB !QPSJO1BUUFSOEFGFBUJOH2VJDLTPSUJO(P
View Slide
தଜ߂ΤϜεϦʔͷ"*ɾػցֶशνʔϜͷιϑτΣΞΤϯδχΞͰओʹݕࡧج൫पΓΛ୲͍ͯ͠Δɻ֤छΞΧϯτQPSJOͰͬͯ·͢ɻ)*SPNV/BLBNVSBThe Gopher was designed by Renée French
*OUSPEVDUJPO
ϦϦʔεϊʔυݟΔͱTPSUύοέʔδͷ෦ΞϧΰϦζϜ͕ԿΒมߋ͞ΕͨͬΆ͍(PͷTPSUύοέʔδͷมߋ
࣮ࡍʹTPSU[TPSUGVODHPͱTPSU[TPSUJOUFSGBDFHPʹͦΕͧΕQERTPSU@GVODɺQERTPSUͱ͍͏͕ؔՃ͞Ε͍ͯΔɻݺͼग़͍ͯ͠ΔͷTPSU4PSUͱTPSU4MJDF(PͷTPSUύοέʔδͷมߋ
ࠓճ1BUUFSOEFGFBUJOH2VJDLTPSU<>ͷจΛಡΜͰ͍͖ɺ(PͰͲͷΑ͏ʹ࣮͞Ε͍ͯΔ͔؆୯ʹݟ͍ͯ͘1BUUFSOEFGFBUJOH2VJDLTPSU[1] https://arxiv.org/abs/2106.05123
1BUUFSOEFGFBUJOH2VJDLTPSUͷͬ͘͟Γͱͨ͠ཧղূ໌ͳͲࡉ͔͍εΩοϓͯ͠ͳΜͱͳ͘ԿΛͬͯΔͷ͔ͷཧղΛࢦ͢͜ͷൃදͰಘΕΔͷ
1BUUFSOEFGFBUJOH2VJDLTPSU
*OUSPTPSUͷ෮श1BUUFSOEFGFBUJOH2VJDLTPSUΠϯτϩιʔτͷվྑ൛ͳͷͰɺ؆୯ʹΠϯτϩιʔτΛ෮श͓͖ͯ͠·͢ɻΠϯτϩιʔτۙ࠷༻͞Ε͍ͯΔϋΠϒϦουιʔτΞϧΰϦζϜͰ͋ΓɺૠೖιʔτɺώʔϓιʔτɺΫΠοΫιʔτΛΈ߹ΘͤͨϋΠϒϦουΞϧΰϦζϜͰ͢ɻώϡʔϦεςΟοΫͳํ๏Ͱɺ͍ͭͲͷઓུΛ࠾༻͢Δ͔Λܾఆ͠·͢ɻྫ͑ɺ࠶ؼͷਂ͕͞ਂ͘ͳΓ͗͢ΔͱώʔϓιʔτʹΓସ͑ͨΓɺύʔςΟγϣϯͷαΠζ͕খ͘͞ͳΓ͗͢ΔͱૠೖιʔτʹΓସ͑ͨΓ͠·͢ɻ
1BUUFSOEFGFBUJOH2VJDLTPSUΠϯτϩιʔτΛ֦ு͓Αͼվྑͨ͠ͷͰ͢ɻޙͰৄ͘͠આ໌͍͖ͯ͠·͕͢ɺ1BUUFSOEFGFBUJOH2VJDLTPSUͷ؊؆୯ʹݴ͏ͱύʔςΟγϣϯॲཧΛ͍͍ײ͡ʹͨ͠࠷ѱέʔεΛ্ख͘ݕͯ͠ϑΥʔϧόοΫ͢ΔΑ͏ʹͨ͠ͷͭͰ͢ɻ1BUUFSOEFGFBUJOH2VJDLTPSU֓ཁ
ॏෳΛؚΉཁૉͷγʔέϯεΛιʔτ͢Δ1BUUFSOEFGFBUJOH2VJDLTPSUͷࢹ֮Խɻ1BUUFSOEFGFBUJOH2VJDLTPSU֓ཁ
1BSUJUJPOJOH
1BUUFSOEFGFBUJOH2VJDLTPSUΦϥϯμࠃضͷߟ͑ํ͕ϕʔεʹͳ͍ͬͯΔͷͰɺ·ͣΦϥϯμࠃضΛ෮श͠·͢ɻΦϥϯμࠃضɺɺͷΈΛؚΉγʔέϯεΛಉ͡ཁૉͰύʔςΟγϣϯ͢ΔͰ͢ɻྫ͑ԼهͷJOΛPVUʹม͢ΔͰ͢ɻ JOPVU1BSUJUJPOJOH
1BSUJUJPOJOH ΞϧΰϦζϜ୯७Ͱઢܗ࣌ؒͰղ͚·͢ɻNJEͱMPXΛྻͷ࠷ॳͷཁૉͷJOEFYʹηοτ͠ɺIJHIΛ࠷ޙͷཁૉͷJOEFYʹηοτ͠·͢ɻw ͠NJEͳΒMPXͱNJEͷཁૉΛSFQMBDFͯ͠IJHIͰσΫϦϝϯτw ͠NJEͳΒNJEΛΠϯΫϦϝϯτw ͠NJEͳΒIJHIͱNJEͷཁૉΛSFQMBDFͯ͠IJHIΛσΫϦϝϯτ
MPXNJEIJHI
MPXNJEIJHI MPXNJEIJHINJEͳͷͰɺIJHIͱSFQMBDFͯ͠IJHI
MPXNJEIJHI MPXNJEIJHI MPX NJE IJHINJEͳͷͰɺIJHIͱSFQMBDFͯ͠IJHINJEͳͷͰɺNJE
MPXNJEIJHI MPXNJEIJHI MPX NJE IJHI MPX NJE IJHINJEͳͷͰɺIJHIͱSFQMBDFͯ͠IJHINJEͳͷͰɺNJENJEͳͷͰɺMPXͱSFQMBDFͯ͠NJE MPX
MPXNJEIJHI MPXNJEIJHI MPX NJE IJHI MPX NJE IJHI MPX NJE IJHINJEͳͷͰɺIJHIͱSFQMBDFͯ͠IJHINJEͳͷͰɺNJENJEͳͷͰɺMPXͱSFQMBDFͯ͠NJE MPXNJEͳͷͰɺMPXͱSFQMBDFͯ͠NJE MPX
MPXNJEIJHI MPXNJEIJHI MPX NJE IJHI MPX NJE IJHI MPX NJE IJHI MPX NJEIJHINJEͳͷͰɺIJHIͱSFQMBDFͯ͠IJHINJEͳͷͰɺNJENJEͳͷͰɺMPXͱSFQMBDFͯ͠NJE MPXNJEͳͷͰɺMPXͱSFQMBDFͯ͠NJE MPXNJEͳͷͰɺNJE
MPXNJEIJHI MPXNJEIJHI MPX NJE IJHI MPX NJE IJHI MPX NJE IJHI MPX NJEIJHIMPX NJEIJHI NJEͳͷͰɺIJHIͱSFQMBDFͯ͠IJHINJEͳͷͰɺNJENJEͳͷͰɺMPXͱSFQMBDFͯ͠NJE MPXNJEͳͷͰɺMPXͱSFQMBDFͯ͠NJE MPXNJEͳͷͰɺNJENJEͳͷͰɺIJHIͱSFQMBDFͯ͠IJHINJE͕IJHIΛ͑ͨͷͰऴྃ
1BSUJUJPOJOHJO1BUUFSOEFGFBUJOH2VJDLTPSU ୯७ͳΫΠοΫιʔτͷ࣮Ͱɺ͍͠ൺֱཁૉΛಉ͡ύʔςΟγϣϯʹஔ͢Δ͜ͱʹΑΓϺ O?ͷ࠷ѱͷέʔε͕Ҿ͖ى͜͞Ε·͢ɻ͍͠ཁૉΛޮతʹॲཧ͢Δʹɺ͍͠ཁૉΛूΊͯɺͦΕΑΓେ͖͍ཁૉɺখ͍͞ཁૉͷׂʹͰ͖ΕɺͦͷޙͷιʔτͰ͍͠ཁૉΛؚΉύʔςΟγϣϯͷιʔτΛεΩοϓͰ͖·͢ɻ·͞ʹΦϥϯμࠃضͱಉͷࡾׂͷߟ͑ํ͕͑ͦ͏Ͱ͢ɻ͜ͷΑ͏ʹύʔςΟγϣϯΛׂͰ͖Δͱخ͍͠
1BSUJUJPOJOHJO1BUUFSOEFGFBUJOH2VJDLTPSU ͜Ε·Ͱʹઆ໌ͨ͠Φϥϯμͷࠃضͷղ๏Λ୯७ʹద༻͢Δͱɺͯ͢ͷཁૉΛεϫοϓ͢ΔલʹϐϘοτͱ͍͔͠Ͳ͏͔Λ໌ࣔతʹνΣοΫ͢Δඞཁ͕͋Γ·͢ɻ͜Εɺ͍͠ཁૉ͕ଟଘࡏ͢Δ͔Ͳ͏͔ʹؔͳ͘ൃੜ͠ɺฏۉతͳέʔεͰύϑΥʔϚϯε͕Լ͠·͢ɻ͜ͷจͰ͜ͷʹରॲ͢Δ৽͍͠ղܾࡦΛ͓ٞͯ͠ΓɺLݸͷҟͳΔཁૉΛ࣋ͭೖྗʹରͯ͠0 OLͷ࠷ѱέʔεʹऩ·Δख๏ΛఏҊ͍ͯ͠·͢ɻ1BUUFSOEFGFBUJOH2VJDLTPSUͰ͜ͷख๏ΛϕʔεʹΠϯτϩιʔτΛվྑ͍ͯ͠·͢ɻ
1BSUJUJPO-FGU3JHIU 1 1 QBSUJUJPO@SJHIUQBSUJUJPO@MFGU1BUUFSOEFGFBUJOH2VJDLTPSUͭͷύʔςΟγϣϯ༻ؔΛΈ߹ΘͤͯઌఔͷύʔςΟγϣϯΛୡ͠·͢ɻͭϐϘοτQʹ͍͠ཁૉΛࠨͷύʔςΟγϣϯʹάϧʔϓԽ QBSUJUJPOMFGU͠ɺ͏ͭϐϘοτʹ͍͠ཁૉΛӈͷύʔςΟγϣϯ QBSUJUJPOSJHIUʹάϧʔϓԽ͠·͢ɻ͜ͷύʔςΟγϣϯͷΈํͷརʮཁૉ͕ϐϘοτͷҎ্͔Ͳ͏͔ʯͱ͍͏݅ҰݸͰఆͰ͖Δ͜ͱͰ͢ɻ
1BUJUJPOJO(P(PͰTPSUύοέʔδͷQBUJUJPO͕ؔύʔςΟγϣϯΛ୲͏ɻ࣮ࡍʹؔΛFYQPSUͯ͠Ұճ͚ͩಈ͔ͯ͠ΈΔͱ͔֬ʹQBUJUJPO@MFGUͷ݁ՌΛಘΒΕ͍ͯΔɻ
1BSUJUJPO-FGU3JHIUQBSUJUJPOؔΛར༻ͯ͠࠶ؼతʹγʔέϯεΛύʔςΟγϣϯ͍͖ͯ͠·͢ɻྫ͑ԼهਤͷΑ͏ʹɺϐϘοτQͰЋΛύʔςΟγϣϯ͠ɺ࠶ؼతʹӈଆͷύʔςΟγϣϯΛϐϘοτRͱͯ͠ЌΛύʔςΟγϣϯ͍͖ͯ͠·͢ɻQ͕Rʹ͘͠ͳ͍߹ɺ্هͷεςοϓΛ࠶ؼతʹద༻͠·͢ɻ࠷ऴతʹQRͱͳͬͨ࣌ɺಉ͡ΛਅΜதʹूΊͨߏʹͰ͖͍ͯ·͢ԼਤɻͪͳΈʹɺ͋ΔRͰЌ͕ۭʹͳͬͨ߹ɺQʹ͍͠ཁૉͳ͘ɺЋΛ࠷ॳʹׂͨ͠ͱ͖ʹׂ͕ߦΘΕͨͱ͚݁Δ͜ͱ͕Ͱ͖·͢ɻ
https://www.youtube.com/watch?v=jz-PBiWwNjc ͔ΒҾ༻
1JWPU4FMFDUJPO
+PIO5VLFZ`TOJOUIFSϐϘοτͷબʹ͓͍ͯɺෆۉߧύʔςΟγϣϯॲཧΛආ͚ΔͨΊʹɺͳΔ͘தԝΛબ͢Δ͜ͱ͕ཧͰ͢ɻҰํͰେ͖ͳೖྗͷ߹దͳϐϘοτΛબ͢ΔͷύϑΥʔϚϯεͷ͕ൃੜ͠·͢ɻͦ͜Ͱ͜ͷจͰ༗໊ͳ+PIO5VLFZ`TOJOUIFSͱ͍͏ख๏ͰϐϘοτΛબ͠·͢ɻݫີͳதԝΛܭࢉ͢Δʹͯ͢ͷσʔλϙΠϯτΛอଘ͠ɺͦΕΒΛฒସ͑ͯதؒΛબ͢Δඞཁ͕͋Γ·͕͢ɺ͜ͷํ๏Ͱ͋Εૉૣ͘େࡶͳதԝͷۙࣅ͕ಘΒΕ·͢ɻ
+PIO5VLFZ`TOJOUIFSJO(P࣮ࡍͷ(Pͷ࣮ͰϐϘοτΛબ͢Δαϒγʔέϯεͷ͞ʹΑͬͯϐϘοτબํ๏ΛΓସ͑·͢ɻ͕͞ҎԼͳΒ୯७ʹதԝΛͱΓɺҎԼͳΒ୯७ʹ࠷ॳɺதԝɺ࠷ޙͷͭͷͷதԝΛͱΓɺҎ্ͳΒ+PIO5VLFZ`TOJOUIFSΛར༻͠·͢ɻ
#BE1BUJUJPO
#BE1BUJUJPO 1BUUFSOEFGFBUJOH2VJDLTPSUɺࢦఆͨ͠ϐϘοτύʔηϯλΠϧQ ҙͷΑΓෆۉߧͳׂૢ࡞ΛෆྑύʔςΟγϣϯͱݺͼ·͢ ͪͳΈʹϐϘοτύʔηϯλΠϧQ͕ͩͱཧతύʔςΟγϣϯʹͳΓ·͢ɻྫ͑ԼهͷΑ͏ͳγʔέϯεͰϐϘοτύʔηϯλΠϧͷϙΠϯτࠓճΛ࠾༻ͯ͠͠·͏ͱ΄ͱΜͲύʔςΟγϣϯ͕ػೳ͠·ͤΜɻ
#BE1BUJUJPO :VWBM'JMNVT<>Qͷ࠷దͳέʔεͱൺֱͯ͠ΫΠοΫιʔτͷԼΛௐ·ͨ͠ɻγϟϊϯͷΤϯτϩϐʔΛར༻ͯ͠ɺԼهͷΑ͏ͳάϥϑ͕ॻ͚·͢ɻ͜ͷάϥϑ͔Βɺྫ͑Qͷ߹͚ͩͷ߹ɺཧతͳ߹ͱൺ͚ͯͩ͘ͳΔ͜ͱ͕Θ͔Γ·͢ɻQΛԼճΔͱύϑΥʔϚϯεͷԼ͕ܹ͘͠ͳΔ͜ͱΘ͔Γ·͢ɻ͜ͷͨΊɺQͷᮢΛઃఆ͠ɺͦΕΑΓԼճΔෆྑύʔςΟγϣϯͷέʔε͕ଟ͚ΕϑΥʔϧόοΫ͢ΔઓུΛऔΓ·͢ɻ[3] https://cs.stackexchange.com/questions/31928/solving-recurrence-relation-with-two-recursive-calls/31930#31930
#BE1BUJUJPO ෆྑύʔςΟγϣϯΛෳճૺ۰͢ΔͷΛճආ͢ΔͨΊʹԼهεςοϓΛߦ͍·͢ɻw ࠷ॳʹɺΧϯλʔͱͯ͠MPH αϒγʔέϯεʹઃఆ͠·͢w ෆྑύʔςΟγϣϯʹૺ۰͢ΔͨͼʹɺΧϯλʔΛσΫϦϝϯτ͠·͢w ࠶ؼݺͼग़͠ͷ։࢝࣌ʹΧϯλʔ͕ͷ߹ɺΫΠοΫιʔτͰͳ͘ɺώʔϓιʔτΛ༻จͰ͜ͷϐϘοτύʔηϯλΠϧQͷᮢΛͱ͓ͯ͠Γ(Pʹͳ͍ͬͯ·͢ɻ͜ͷεΩʔϜͷརɺΞʔΩςΫνϟ͕มߋ͞Εͨ߹ ώʔϓιʔτͷΘΓʹผͷ࠷ѱͷέʔεͷιʔτΞϧΰϦζϜΛ༻͍ͯ͠Δ߹ͳͲʹɺͦΕʹ߹ΘͤͯQΛௐͰ͖Δ͜ͱͰ͢ (Pͷ߹͕ϋʔυίʔυ͞Ε͍ͯͯมߋͰ͖ͳ͍ɻ
#BE1BUJUJPO (PͰQERTPSUؔͷMJNJUҾ͕Χϯλʔʹ͋ͨΓɺ͜Ε͕ʹͳΔͱώʔϓιʔτʹΓସΘΓ·͢ɻ
#BE1BUJUJPO ͪͳΈʹͪΐͬͱͨ͠ͱͯ͠Χϯλʔγʔέϯεͷ͞ͷॴཁϏοτͱͯؒ͠తʹMPH@ OΛܭࢉ͍ͯ͠Δɻ
1BUUFSOEFGFBUJOH2VJDLTPSUJO(P
1BUUFSOEFGFBUJOH2VJDLTPSUJO(P(Pʹ࣮͞Εͨ1BUUFSOEFGFBUJOH2VJDLTPSUจͱൺͯԼهͷΑ͏ͳมߋ͕Ճ͑ΒΕ͍ͯ·͢ɻw #MPDL2VJDLTPSUΛͬͨ࠷దԽΛແޮ কདྷՃ͞ΕΔՄೳੑ͋Γͦ͏w ϕϯνϚʔΫ݁Ռʹैͬͯɺ͍͔ͭ͘ͷύϥϝʔλʔΛมߋ
(Pʹ͓͚ΔϕϯνϚʔΫJTTVFͰఏग़͞Ε͍ͯ·͢ɻ΄ͱΜͲͷέʔεͰύϑΥʔϚϯε͕վળ͍ͯ͠·͢ɻ
$PODMVTJPO
$PODMVTJPO(Pʹ࣮͞Εͨ1BUUFSOEFGFBUJOH2VJDLTPSUϕϯνϚʔΫ্༷ʑͳύλʔϯͰύϑΥʔϚϯε͕վળ͍ͯ͠Δɻ1BUUFSOEFGFBUJOH2VJDLTPSUओʹύʔςΟγϣϯॲཧϐϘοτબɺෆྑύʔςΟγϣϯݕͰɺ2VJDLTPSUͷ࠷ѱέʔεΛճආͰ͖ΔΑ͏ʹ͞Ε͍ͯΔɻ(PʹΞοϓάϨʔυͯ͠TPSU͕ͲΕ͘Β͍ૣ͘ͳ͔ͬͨੋඇࢼͯ͠Έ͍ͯͩ͘͞ɻΑΓࡉ͔͍ɺৄ͍͠ূ໌ͳͲจΛࢀর͍ͩ͘͞ɻ
ΤϜεϦʔͰࢸΔॴͰ(PΛ࠾༻ͯ͠։ൃΛ͍ͯ͠ΔɻͪΖΜ(PΛ࣮Ͱͬͨ͜ͱ͕ͳܴͯ͘ɻ ֤छ"1* ΞϓϦέʔγϣϯɺݕࡧɺϨίϝϯυɺϦϥϯΩϯά Ϩίϝϯυ"1* σʔλ࿈ܞ#BUDI 1VTI௨ج൫ ֤छศརπʔϧͷ։ൃ(Pͷษڧձ։͔Ε͓ͯΓɺݱࡏʮ࣮༻(PݴޠʕγεςϜ։ൃͷݱͰ͓͖͍ͬͯͨΞυόΠεʯ<>ͷྠಡձ։͔Ε͍ͯΔɻιϑτΣΞΤϯδχΞ͚ͩͰͳ͘ɺ.-ΤϯδχΞ(P͕ॻ͚Δͱ͍͏ҟ࣭ͳڥɻΤϜεϦʔ(PͰ։ൃ͍ͨ͠ϝϯόʔΛืूத[3] https://www.amazon.co.jp/dp/4873119693/ref=cm_sw_em_r_mt_dp_G4Z5RYS2FDVTVWXVJEYS?_encoding=UTF8&psc=1