Kaz─▒ktan ├žoraplar nas─▒l verimli bir ┼čekilde e┼čle┼čtirilir?


Al─▒nan cevaba git


D├╝n temiz ├žama┼č─▒rlardan ├žoraplar─▒ e┼čle┼čtiriyordum ve yapt─▒─č─▒m gibi ├žok etkili olmad─▒─č─▒n─▒ anlad─▒m. Saf bir arama yap─▒yordum - bir tane ├žorap toplay─▒p, ├žiftini bulmak i├žin kaz─▒klar─▒ ÔÇťtekrarlayarakÔÇŁ. Bu n / 2 * n / 4 = N yineleme gerektirir 2 ortalama / 8 ├žorap.

Bir bilgisayar bilimcisi olarak ne yapabilece─čimi d├╝┼č├╝n├╝yordum? Tabii ki s─▒ralama (boy / renge g├Âre / ...) bir O (NlogN) ├ž├Âz├╝m├╝ elde etmek i├žin akla geldi.

Karmakar─▒┼č─▒k ya da yerinde olmayan ├ž├Âz├╝mler bir se├ženek de─čildir, ├ž├╝nk├╝ ├žoraplar─▒m─▒ ├žo─čaltam─▒yorum (e─čer yapabilirsem g├╝zel olabilirdi).

Yani, soru temelde:

Elemanlar n i├žeren 2n (her ├žorapun tam olarak bir e┼čle┼čme ├žiftine sahip oldu─čunu varsayal─▒m), bir ├žift ├žorap ├žifti g├Âz ├Ân├╝ne al─▒nd─▒─č─▒nda , onlar─▒ logaritmik ekstra alana kadar verimli bir ┼čekilde e┼čle┼čtirmenin en iyi yolu nedir? (Gerekirse bu miktarda bilgiyi hat─▒rlayabildi─čime inan─▒yorum.)

A┼ča─č─▒daki hususlar─▒ ele alan bir cevab─▒ takdir edece─čim:

  • ├çok say─▒da ├žorap i├žin genel bir teorik ├ž├Âz├╝m.
  • Ger├žek ├žorap say─▒s─▒ o kadar b├╝y├╝k de─čil, e┼čime inanm─▒yorum ve 30'dan fazla ├žiftim var. (├çoraplar─▒m─▒ ve ├žoraplar─▒n─▒ ay─▒rt etmek olduk├ža kolayd─▒r; bu da kullan─▒labilir mi?)
  • ├ľ─če ayr─▒l─▒─č─▒ problemine e┼čde─čer mi?

3838





2013-01-19




Cevap say─▒s─▒n─▒ say: 30






S─▒ralama ├ž├Âz├╝mleri ├Ânerildi, ancak s─▒ralama biraz fazla oldu : Sipari┼če ihtiyac─▒m─▒z yok; sadece e┼čitlik gruplar─▒na ihtiyac─▒m─▒z var .

B├Âylece karma┼ča yeterli olacakt─▒r (ve daha h─▒zl─▒).

  1. Her ├žorap rengi i├žin bir t├╝y olu┼čturun . Giri┼č sepetinizdeki t├╝m ├žoraplar─▒ tekrarlay─▒n ve bunlar─▒ renk y─▒─č─▒nlar─▒na da─č─▒t─▒n .
  2. Her bir k├╝me boyunca yineleyin ve ba┼čka bir metrik (├Âr. Desen) ile ikinci k├╝me k├╝mesine da─č─▒t─▒n
  3. T├╝m ├žoraplar─▒ hemen g├Ârsel olarak i┼čleyebilece─činiz ├žok k├╝├ž├╝k y─▒─č─▒nlara da─č─▒t─▒ncaya kadar tekrar tekrar uygulay─▒n.

Bu t├╝r ├Âzyinelemeli karma b├Âl├╝mleme, b├╝y├╝k veri k├╝meleri ├╝zerinde karma birle┼čtirme veya karma toplama gerekti─činde asl─▒nda SQL Server taraf─▒ndan yap─▒lmaktad─▒r . Yap─▒ giri┼či ak─▒┼č─▒n─▒ ba─č─▒ms─▒z olan bir├žok b├Âl├╝me da─č─▒t─▒r. Bu ┼čema iste─če ba─čl─▒ olarak veri miktarlar─▒n─▒ ve ├žoklu CPU'lar─▒ do─črusal olarak ├Âl├žeklendirir.

Her bir kep├ženin ├žok h─▒zl─▒ bir ┼čekilde i┼členecek kadar k├╝├ž├╝k olmas─▒ i├žin yeterli say─▒da kep├že sa─člayan bir da─č─▒t─▒m anahtar─▒ (karma anahtar─▒) bulabilirseniz ├Âzyinelemeli b├Âl├╝mlemeye ihtiyac─▒n─▒z yoktur . Ne yaz─▒k ki, ├žoraplar─▒n b├Âyle bir ├Âzelli─či oldu─čunu sanm─▒yorum.

Her ├žorab─▒n "PairID" ad─▒nda bir tamsay─▒ya sahip olmas─▒ durumunda, bir tanesi bunlar─▒ PairID % 10 (son hane) g├Âre 10 kovaya kolayca da─č─▒tabilir .

Akl─▒ma gelen en iyi ger├žek d├╝nya b├Âl├╝m├╝ , y─▒─č─▒nlar─▒n bir dikd├Ârtgeni yaratmakt─▒r : bir boyut renk, di─čeri kal─▒pt─▒r. Neden bir dikd├Ârtgen? ├ç├╝nk├╝ kaz─▒klara O (1) rasgele eri┼čime ihtiyac─▒m─▒z var. (Bir 3B k├╝boid de ├žal─▒┼čacakt─▒, ancak bu pek pratik de─čil.)


G├╝ncelle┼čtirme:

Paralellik ne olacak ? Birden fazla insan ├žoraplarla daha h─▒zl─▒ e┼čle┼čebilir mi?

  1. En basit paralelle┼čtirme stratejisi, birden fazla i┼č├žinin giri┼č sepetinden almalar─▒n─▒ ve ├žoraplar─▒ y─▒─č─▒nlara koymalar─▒n─▒ sa─člamakt─▒r. Bu sadece ├žok fazla ├Âl├žeklendirir - 10 kaz─▒ktan 100 sava┼čan insan oldu─čunu hayal edin. Senkronizasyon maliyetleri (kendilerini ├žarp─▒┼čmalar ve insan ileti┼čimi olarak g├Âsterir) verimlili─či ve h─▒zlanmay─▒ tahrip eder (bkz. Evrensel ├ľl├žeklenebilirlik Yasas─▒ !). Bu kilitlenme e─čilimli midir? Hay─▒r, ├ž├╝nk├╝ her i┼č├žinin bir seferde yaln─▒zca bir y─▒─č─▒na eri┼čmesi gerekir. Sadece bir "kilit" ile kilitlenme olamaz. Livelocks , insanlar─▒n y─▒─č─▒nlara eri┼čimi nas─▒l koordine etti─čine ba─čl─▒ olabilir. Hangi kartlar─▒n yaln─▒zca a─č kablosuna eri┼čebilece─čini belirlemek i├žin fiziksel kartlar gibi a─č kartlar─▒ gibi rasgele geri ├žekilme kullanabilirler . Onun i├žin ├žal─▒┼č─▒rsa NIC , insanlar i├žin ├žal─▒┼čmak yan─▒ gerekir.
  2. Her bir i┼č├žinin kendi kaz─▒k k├╝mesi varsa, neredeyse s├╝resiz olarak ├Âl├žeklenir . ─░┼č├žiler daha sonra b├╝y├╝k miktarda ├žorap toplar─▒n─▒ giri┼č sepetinden alabilir (nadiren yapt─▒klar─▒ i├žin ├žok az ├žeki┼čme olur) ve ├žoraplar─▒ da─č─▒t─▒rken e┼čitleme yapmalar─▒ gerekmez (├ž├╝nk├╝ y├Âresel y─▒─č─▒nlara sahip olduklar─▒ i├žin). Sonunda, t├╝m ├žal─▒┼čanlar─▒n k├╝me k├╝melerini birle┼čtirmeleri gerekir. ─░┼č├žilerin bir toplama a─čac─▒ olu┼čturmas─▒ durumunda, O'da (k├╝t├╝k (i┼č├ži say─▒s─▒ * i┼č├ži ba┼č─▒na kaz─▒k)) yap─▒labilece─čine inan─▒yorum .

Peki eleman ├že┼čitlilik sorunu ? Makalede belirtildi─či gibi, elemanlar─▒n ayr─▒mc─▒l─▒k sorunu ├ž├Âz├╝lebilir O(N) . Bu, ├žorap sorunu i├žin de ayn─▒d─▒r (ayr─▒ca O(N) , yaln─▒zca bir da─č─▒t─▒m ad─▒m─▒na ihtiyac─▒n─▒z varsa (yaln─▒zca hesaplamalarda insanlar k├Ât├╝ oldu─ču i├žin birden fazla ad─▒m ├Ânerdim - e─čer da─č─▒t─▒m yaparsan─▒z bir ad─▒m yeterli olur md5(color, length, pattern, ...) , yani t├╝m ├Âzelliklerin m├╝kemmel bir karmas─▒ ).

A├ž─▒k├žas─▒, biri daha h─▒zl─▒ gidemez O(N) , bu y├╝zden en uygun alt s─▒n─▒ra ula┼čt─▒k .

├ç─▒kt─▒lar tamamen ayn─▒ olmasa da (bir durumda, sadece bir boolean. Di─čerinde ise ├žorap ├žiftleri), asimptotik karma┼č─▒kl─▒klar ayn─▒d─▒r.


2407







─░nsan beyninin mimarisi modern bir i┼člemciden tamamen farkl─▒ oldu─ču i├žin bu soru pratik bir anlam ifade etmiyor.

─░nsanlar "e┼čle┼čen ├žifti bulmak" ├žok b├╝y├╝k olmayan bir set i├žin tek bir i┼člem olabilir ger├že─čini kullanarak CPU algoritmalar─▒n─▒ kazanabilirler.

Algoritmam:

 spread_all_socks_on_flat_surface();
while (socks_left_on_a_surface()) {
     // Thanks to human visual SIMD, this is one, quick operation.
     pair = notice_any_matching_pair();
     remove_socks_pair_from_surface(pair);
}
 

En az─▒ndan ger├žek hayatta kulland─▒─č─▒m ┼čey bu ve ├žok verimli buluyorum. Dezavantaj─▒ ise d├╝z bir y├╝zey gerektirir, ancak genellikle bol miktarda bulunur.


569







Durum 1 : B├╝t├╝n ├žoraplar ayn─▒ (bu arada ger├žek hayatta bunu yap─▒yorum).

Bir ├žift yapmak i├žin ikisinden birini se├žin. Sabit zaman.

Durum 2 : Sabit say─▒da kombinasyon vard─▒r (sahiplik, renk, boyut, doku vb.).

Radix s─▒ralamas─▒n─▒ kullan─▒n . Kar┼č─▒la┼čt─▒rma gerekmedi─činden bu sadece do─črusal zamand─▒r.

Durum 3 : Kombinasyon say─▒s─▒ ├Ânceden bilinmemektedir (genel durum).

─░ki ├žorab─▒n ├žift olup olmad─▒─č─▒n─▒ kontrol etmek i├žin kar┼č─▒la┼čt─▒rma yapmal─▒y─▒z. O(n log n) Kar┼č─▒la┼čt─▒rma tabanl─▒ s─▒ralama algoritmalar─▒ndan birini se├žin .

Ancak, ger├žek hayatta ├žorap say─▒s─▒n─▒n g├Âreceli olarak k├╝├ž├╝k (sabit) oldu─ču durumlarda, bu teorik olarak en uygun algoritmalar iyi ├žal─▒┼čmaz. Teorik olarak ikinci dereceden zaman gerektiren s─▒ral─▒ aramaya g├Âre daha fazla zaman alabilir.


250







Algoritmik olmayan cevap, fakat bunu yaparken de "verimli":

  • adim 1) mevcut t├╝m ├žoraplar─▒n─▒z─▒ at─▒n

  • adim 2) Walmart'a gidin ve onlar─▒ 10'luk beyaz ve m'l─▒k siyah paketlerinden sat─▒n al─▒n. G├╝nl├╝k ya┼čamda ba┼čka renklere gerek yok.

Yine de zaman zaman, bunu tekrar yapmak zorunda kald─▒m (├žoraplar─▒ kaybettim, ├žoraplar─▒ y─▒pratt─▒m, vb.) Ve ├žok iyi ├žoraplar─▒ ├žok s─▒k atmaktan nefret ederim (ve ayn─▒ ├žorap referans─▒n─▒ satmaya devam etmelerini diledim!), Bu y├╝zden ge├ženlerde ald─▒m. Farkl─▒ bir yakla┼č─▒m.

Algoritmik cevap:

─░kinci ├žorap y─▒─č─▒n─▒ i├žin yaln─▒zca bir ├žorap ├žekti─činize g├Âre, yapt─▒─č─▒n─▒z gibi, naif bir aramada e┼čle┼čen ├žorab─▒ bulma ihtimaliniz olduk├ža d├╝┼č├╝kt├╝r.

  • Bu y├╝zden be┼č tanesini rastgele al─▒n ve ┼čekillerini veya uzunluklar─▒n─▒ ezberleyin.

Neden be┼č? Genellikle insanlar, ├žal─▒┼čma belle─čindeki be┼č ila yedi farkl─▒ ├Â─čeyi hat─▒rl─▒yorlar - bir RPN y─▒─č─▒n─▒n─▒n insan e┼čde─čeri gibi - be┼č g├╝venli bir varsay─▒land─▒r.

  • 2n-5 y─▒─č─▒n─▒ndan bir tane al.

  • ┼×imdi bir e┼čle┼čme aray─▒n (g├Ârsel desen e┼čle┼čtirme - insanlar k├╝├ž├╝k bir y─▒─č─▒nla iyi gelir), ├žekti─činiz be┼čin i├žinde, e─čer bulamazsan─▒z, bunu be┼činize ekleyin.

  • ─░stifte rastgele ├žorap toplamaya devam edin ve bir ma├ž i├žin 5 + 1 ├žoraplar─▒n─▒z─▒ kar┼č─▒la┼čt─▒r─▒n. Y─▒─č─▒n─▒n─▒z b├╝y├╝d├╝k├že performans─▒n─▒z─▒ d├╝┼č├╝rebilir ancak oran─▒n─▒z─▒ art─▒racak. ├çok daha h─▒zl─▒.

Bir e┼čle┼čmenin% 50 oran─▒n─▒ almak i├žin ka├ž ├Ârnek alman─▒z gerekti─čini hesaplamak i├žin form├╝l├╝ yazmaktan ├žekinmeyin. IIRC bu bir hipergeometrik yasad─▒r.

Bunu her sabah yap─▒yorum ve nadiren ├╝├žten fazla ├žekili┼če ihtiyac─▒m var - ancak n benzer m beyaz ├žiftlerim var (10'a yak─▒n, kaybolanlar─▒ verir veya al─▒r) . ┼×imdi, stok y─▒─č─▒n─▒m─▒n boyutunu tahmin edebilirsiniz :-)

BTW , bir ├žifte ihtiya├ž duydu─čum her ├žorab─▒ s─▒ralama i┼člem maliyetlerinin toplam─▒n─▒n, bir defa yapmaktan ve ├žoraplar─▒ ba─člamaktan ├žok daha az oldu─čunu buldum. Tam zaman─▒nda ├žal─▒┼čanlar daha iyi ├žal─▒┼č─▒r ├ž├╝nk├╝ o zaman ├žoraplar─▒ ba─člamak zorunda kalmazs─▒n─▒z ve ayr─▒ca azalan bir marjinal d├Ân├╝┼č vard─▒r (yani, ├žama┼č─▒rhanede bir yerde ve ihtiya├ž duydu─čunuzda iki veya ├╝├ž ├žorap aramaya devam edersiniz) ├çoraplar─▒n─▒z─▒ e┼čle┼čtirmek ve bu konuda zaman kaybetmek).


154







Yapt─▒─č─▒m ┼čey ilk ├žorab─▒m─▒ al─▒p a┼ča─č─▒ koymam (├žama┼č─▒r kab─▒n─▒n kenar─▒na diyelim). Sonra ba┼čka bir ├žorap al─▒p ilk ├žorapla ayn─▒ olup olmad─▒─č─▒n─▒ kontrol ediyorum. ├ľyleyse, ikisini de kald─▒r─▒r─▒m. De─čilse ilk ├žorab─▒n yan─▒na koydum. Sonra ├╝├ž├╝nc├╝ ├žorab─▒ al─▒yorum ve bunu ilk ikisiyle kar┼č─▒la┼čt─▒r─▒yorum (e─čer hala oradalarsa). Vb.

Bu yakla┼č─▒m, ├žoraplar─▒n "├ž─▒kar─▒lmas─▒n─▒n" bir se├ženek oldu─ču varsay─▒larak, bir dizide olduk├ža kolay bir ┼čekilde uygulanabilir. Asl─▒nda, ├žoraplar─▒ "├ž─▒karmana" bile gerek yok. ├çoraplar─▒n s─▒ralanmas─▒ gerekmiyorsa (a┼ča─č─▒ya bak─▒n─▒z), o zaman onlar─▒ hareket ettirebilir ve t├╝m ├žoraplar─▒ dizide ├žiftler halinde d├╝zenlenmi┼č bir dizi ile sona erdirebilirsiniz.

├çorap i├žin sadece operasyon e┼čitlik i├žin kar┼č─▒la┼čt─▒rmakt─▒r varsay─▒ld─▒─č─▒nda, bu algoritma temelde hala n 2 I (o hesapla hi├ž ├Â─črenemedim) ortalama dava hakk─▒nda bilmiyorum ama, algoritma.

S─▒ralama, tabii ki, ├Âzellikle di─čer iki ├žorap aras─▒na bir ├žorab─▒ kolayca "takabilece─činiz" ger├žek hayatta verimlili─či artt─▒r─▒r. Ayn─▒ bilgiyi hesaplamak bir a─ča├žla sa─članabilir, fakat bu fazladan bir bo┼čluktur. Ve tabii ki, biz NlogN'a geri d├Ând├╝k (veya ayn─▒ kritere g├Âre ayn─▒, ancak ayn─▒ ├žiftten olmayan birka├ž ├žorap varsa).

Bunun d─▒┼č─▒nda hi├žbir ┼čey d├╝┼č├╝nemiyorum, ama bu y├Ântem ger├žek hayatta olduk├ža etkili g├Âr├╝n├╝yor. :)


103







Bu yanl─▒┼č soruyu soruyor. Sorulmas─▒ gereken do─čru soru, neden ├žoraplar─▒ s─▒ralayarak zaman harc─▒yorum? Se├žti─činiz X para birimi i├žin bo┼č zaman─▒n─▒z─▒ de─čerlendirdi─činizde y─▒ll─▒k bazda maliyeti ne kadard─▒r?

Ve ├žo─ču zaman daha fazla, bu adil de─čil herhangi 's, serbest zaman sabah yatakta ge├žirmek veya kahvenizi yudumlarken ya da erken biraz b─▒rakarak ve trafikte yakalanmaktan de─čil edilebilece─či, serbest zaman.

Geri ad─▒m atmak ve sorunun etraf─▒nda bir yol d├╝┼č├╝nmek ├žo─ču zaman iyidir.

Ve bir yolu var!

Be─čendi─činiz bir ├žorap bulun. T├╝m ilgili ├Âzellikleri g├Âz ├Ân├╝nde bulundurun: farkl─▒ ayd─▒nlatma ko┼čullar─▒nda renk, genel kalite ve dayan─▒kl─▒l─▒k, farkl─▒ iklim ko┼čullar─▒nda konfor ve koku emilim. Ayr─▒ca, depolamada elastikiyetini kaybetmemeleri, do─čal kuma┼člar─▒n iyi olmas─▒ ve plastik bir ambalajda mevcut olmalar─▒ da ├Ânemlidir.

Sol ve sa─č ayak ├žoraplar─▒ aras─▒nda fark yoksa daha iyidir, ancak kritik de─čildir. ├çoraplar sol-sa─č simetrik ise, bir ├žift bulmak O (1) i┼člemdir ve ├žoraplar─▒ s─▒ralamak yakla┼č─▒k O (M) i┼člemdir; burada M, evinizde, ├žoraplarla kirletti─činiz yerlerin say─▒s─▒d─▒r; k├╝├ž├╝k sabit say─▒

Farkl─▒ sol ve sa─č ├žorap ile s├╝sl├╝ bir ├žift se├žtiyseniz, sola ve sa─č ayak kovalar─▒na tam bir kova s─▒ralamas─▒ yapmak, O (N + M) 'yi al─▒r; burada N, ├žorap say─▒s─▒ ve M, yukar─▒dakiyle ayn─▒d─▒r. Bir ba┼čkas─▒, ilk ├žifti bulma ortalama yinelemeleri i├žin form├╝l├╝ verebilir, ancak k├Âr arama ile bir ├žift bulmak i├žin en k├Ât├╝ durum, N / 2 + 1'dir; bu, makul N i├žin astronomik olarak muhtemel olmayan bir durumdur. Mk1 Eyeball ile s─▒ralanmam─▒┼č ├žorap y─▒─č─▒n─▒ tararken tan─▒ma algoritmalar─▒ ve sezgisel tarama .

Dolay─▒s─▒yla, O (1) ├žorap e┼čle┼čtirme verimlili─čini (simetrik ├žorap varsayarak) elde etmek i├žin bir algoritma ┼čudur:

  1. Hayat─▒n─▒z─▒n geri kalan─▒nda veya belki de bir daha ├žorap giymeye gerek kalmadan daha s─▒cak iklimlere emekli olana kadar hareket edene kadar ka├ž ├žorap ├žiftine ihtiyac─▒n─▒z olaca─č─▒n─▒ tahmin etmeniz gerekir. Gen├žseniz, evimizde ├žorap s─▒ralama robotlar─▒ kullanmadan ├Ânce ne kadar s├╝rece─čini tahmin edebilirsiniz ve t├╝m sorun ilgisiz hale gelir.

  2. Se├žti─činiz ├žorab─▒n─▒z─▒ toplu olarak nas─▒l sipari┼č edebilece─činizi, ne kadara mal olaca─č─▒n─▒ ve ne ┼čekilde teslim ettiklerini ├Â─črenmeniz gerekir.

  3. ├çoraplar─▒ sipari┼č et!

  4. Eski ├žoraplar─▒ndan kurtul.

Alternatif bir ad─▒m 3, y─▒llar i├žinde bir seferde birka├ž ├žift olarak ayn─▒ miktarda belki daha ucuz ├žorap sat─▒n alma maliyetlerinin kar┼č─▒la┼čt─▒r─▒lmas─▒n─▒ ve ├žoraplar─▒n s─▒ralama maliyetinin eklenmesini i├žerir, ancak bunun i├žin s├Âz veriyorum: toplu olarak sat─▒n almak daha ucuzdur! Ayr─▒ca, depodaki ├žoraplar, hisse senetleri fiyat enflasyonu oran─▒nda de─čer kazanmaktad─▒r, bu da bir├žok yat─▒r─▒ma girdi─činizden daha fazla olacakt─▒r. Sonra yine depolama maliyeti de var, ancak ├žoraplar dolab─▒n ├╝st raf─▒nda fazla yer kaplamaz.

Sorun ├ž├Âz├╝ld├╝. Bu y├╝zden, sadece yeni ├žoraplar al─▒n, eskilerini at─▒n / ba─č─▒┼člay─▒n ve hayat─▒n─▒z─▒n geri kalan─▒nda her g├╝n para ve zaman kazand─▒─č─▒n─▒z─▒ bildikten sonra mutlu bir ┼čekilde ya┼čay─▒n.


58







Teorik limit O (n) 'dir ├ž├╝nk├╝ her ├žoraba dokunman─▒z gerekir (baz─▒lar─▒ zaten bir ┼čekilde e┼čle┼čtirilmi┼č de─čilse).

Radix s─▒ralama ile O (n) elde edebilirsiniz . Sadece kovalar i├žin baz─▒ ├Âzellikler se├žmeniz gerekir.

  1. ─░lk ├Ânce sen se├žebilirsin (onunki, benimki) - onlar─▒ 2 kazana b├Âl.
  2. sonra renkleri kullan─▒n (renkler i├žin herhangi bir s─▒raya sahip olabilir, ├Ârne─čin renk ad─▒na g├Âre alfabetik olarak) - bunlar─▒ renklere g├Âre y─▒─č─▒nlara ay─▒r─▒n (ayn─▒ y─▒─č─▒ndaki t├╝m ├žoraplar i├žin ilk s─▒ray─▒ 1. ad─▒mdan itibaren tutmay─▒ unutmay─▒n),
  3. sonra ├žorap uzunlu─ču,
  4. sonra doku, ....

S─▒n─▒rl─▒ say─▒da ├Âzellik, ancak her bir ├žifti benzersiz bir ┼čekilde tan─▒mlayabilecek yeterli ├Âzellik se├žebilirseniz, k'nin s─▒n─▒rl─▒ oldu─čunu d├╝┼č├╝nebilirsek, O (n) olan O (k * n) 'da yap─▒lmal─▒d─▒r.


49







Pratik bir ├ž├Âz├╝m olarak:

  1. H─▒zla kolayca ay─▒rt edilebilir ├žorap y─▒─č─▒nlar─▒ yap─▒n. (Renge g├Âre s├Âyle)
  2. Her kaz─▒─č─▒ h─▒zl─▒ bir ┼čekilde al─▒n ve kar┼č─▒la┼čt─▒rmak i├žin ├žorap uzunlu─čunu kullan─▒n. Bir insan olarak, en k├Ât├╝ durumdan ka├ž─▒nan b├Âlmeye kullanmak i├žin ├žoraplar─▒n olduk├ža h─▒zl─▒ bir ┼čekilde karar vermesini sa─člayabilirsiniz. (Paralel olarak birden fazla ├žorap g├Ârebilirsiniz, bunu kendi avantaj─▒n─▒za kullan─▒n!)
  3. Spot ├žiftleri ve an─▒nda pa├žavra ├žoraplar─▒ kolayca bulabilece─činiz e┼či─če ula┼čt─▒─č─▒nda y─▒─č─▒nlar─▒ s─▒ralamay─▒ durdurun

E─čer 1000 renginiz varsa, 8 renk ve ortalama bir da─č─▒l─▒m varsa, her 125 ├žoraptan 4 kaz─▒k c * n zaman─▒nda yapabilirsiniz. 5 ├žorap e┼či─čiyle, her t├╝y├╝ 6 turda s─▒ralayabilirsiniz. (Do─čru kaz─▒k ├╝zerine bir ├žorap atmak i├žin 2 saniye saymak 4 saatin alt─▒nda biraz alacakt─▒r.)

Sadece 60 ├žorab─▒n─▒z, 3 renginiz ve 2 ├žorab─▒n─▒z varsa (sizin / kar─▒n─▒z) 10 ├žorab─▒n her birini 1 turda s─▒ralayabilirsiniz (Yine e┼čik = 5). (2 saniye saymak 2 dakika s├╝rer).

─░lk kova s─▒ralamas─▒ i┼čleminizi h─▒zland─▒racakt─▒r, ├ž├╝nk├╝ n ├žoraplar─▒n─▒z─▒ c*n zaman i├žinde k kovalara b├Âler, b├Âylece yaln─▒zca c*n*log(k) i┼č yapman─▒z gerekir . (E┼či─či dikkate almamak). n*c*(1 + log(k)) ─░┼čle ilgili yapt─▒─č─▒n─▒z her i┼čte, c y─▒─č─▒na ├žorap atman─▒n zaman─▒d─▒r.

Bu yakla┼č─▒m, c*x*n + O(1) kabaca herhangi bir y├Ânteme k─▒yasla olumlu olacakt─▒r log(k) < x - 1 .


Bilgisayar biliminde bu yard─▒mc─▒ olabilir: Bir ┼čeyler koleksiyonumuz var , bunlardan bir sipari┼č (uzunluk) ve ayr─▒ca bir denklik ili┼čkimiz (├Ârne─čin ├žoraplar─▒n rengi gibi ekstra bilgiler) var. E┼čde─čerlik ili┼čkisi, orijinal koleksiyonun bir b├Âl├╝m├╝n├╝ olu┼čturmam─▒z─▒ sa─člar ve her denklik s─▒n─▒f─▒nda sipari┼čimiz hala korunur. Bir ┼čeyin denklik s─▒n─▒f─▒na e┼členmesi O (1) 'de yap─▒labilir, dolay─▒s─▒yla her bir ├Â─čeyi bir s─▒n─▒fa atamak i├žin sadece O (n) gereklidir. Art─▒k ekstra bilgilerimizi kulland─▒k ve her s─▒n─▒f─▒ s─▒ralamak i├žin herhangi bir ┼čekilde ilerleyebiliriz. Bunun avantaj─▒, veri setlerinin zaten ├Ânemli ├Âl├ž├╝de daha k├╝├ž├╝k olmas─▒d─▒r.

Y├Ântem ayn─▒ zamanda i├ž i├že ge├žebilir, e─čer birden fazla denklik ili┼čkimiz varsa -> dokudaki her y─▒─č─▒n b├Âl├╝m├╝nden ziyade renk y─▒─č─▒nlar─▒ yap─▒n, boyuna g├Âre s─▒ralay─▒n. Yakla┼č─▒k e┼čit boyutta 2'den fazla eleman i├žeren bir b├Âl├╝m olu┼čturan herhangi bir denklik ili┼čkisi, s─▒ralama ├╝zerinde daha h─▒zl─▒ bir iyile┼čme sa─člayacakt─▒r (k├╝mesine do─črudan bir ├žorap atayabilmemiz ko┼čuluyla) ve s─▒ralama, daha k├╝├ž├╝k veri k├╝melerinde ├žok h─▒zl─▒ bir ┼čekilde ger├žekle┼čebilir.


31







Yanl─▒┼č sorunu ├ž├Âzmeye ├žal─▒┼č─▒yorsun.

1. ├ç├Âz├╝m: Kirli ├žoraplar─▒ ├žama┼č─▒r sepetinize her yerle┼čtirdi─činizde, k├╝├ž├╝k bir d├╝─č├╝me ba─člay─▒n. Bu sayede y─▒kamadan sonra herhangi bir s─▒ralama yapman─▒z gerekmeyecektir. Bir Mongo veritaban─▒na indeks kaydetmek gibi d├╝┼č├╝n├╝n. Gelecekte baz─▒ CPU tasarruflar─▒ i├žin biraz ├žal─▒┼čma.

2. ├ç├Âz├╝m: K─▒┼č ise, uygun ├žoraplar giymeniz gerekmez. Biz programc─▒y─▒z. ├çal─▒┼čt─▒─č─▒ s├╝rece kimsenin bilmesi gerekmez.

3. ├ç├Âz├╝m: ├çal─▒┼čmay─▒ yay─▒n. Kullan─▒c─▒ arabirimini engellemeden b├Âyle bir karma┼č─▒k CPU i┼člemini e┼čzamans─▒z olarak ger├žekle┼čtirmek istiyorsunuz. O ├žorap y─▒─č─▒n─▒n─▒ al ve bir ├žantaya doldur. Sadece ihtiyac─▒n─▒z oldu─čunda bir ├žift aray─▒n. Bu ┼čekilde ald─▒─č─▒ i┼č miktar─▒ ├žok daha az fark edilir.

Bu yard─▒mc─▒ olur umar─▒m!


27







Bu soru asl─▒nda ├žok felsefidir. Kalbinde, insanlar─▒n problemleri ├ž├Âzme g├╝c├╝n├╝n (beynimizin "sulak ─▒s─▒nmas─▒") algoritmalarla yap─▒labileceklere e┼čde─čer olup olmad─▒─č─▒ ile ilgilidir.

├çorap s─▒ralamas─▒ i├žin bariz bir algoritma:

 Let N be the set of socks that are still unpaired, initially empty
for each sock s taken from the dryer
  if s matches a sock t in N
    remove t from N, bundle s and t together, and throw them in the basket
  else
    add s to N
 

┼×imdi bu problemin i├žindeki bilgisayar bilimi t├╝m ad─▒mlarla ilgili

  1. msgstr "" N ├žorapl─▒ ├žiftler varsa ". ┼×imdiye kadar g├Ârd├╝─č├╝m├╝z├╝ ne kadar ├žabuk hat─▒rlayabiliriz?
  2. "t'yi N'den kald─▒r" ve "N'ye s ekle". ┼×imdiye kadar g├Ârd├╝─č├╝m├╝z├╝ takip etmek ne kadar pahal─▒?

─░nsanlar bunlar─▒ etkilemek i├žin ├že┼čitli stratejiler kullanacakt─▒r. ─░nsan haf─▒zas─▒ olan ├ža─čr─▒┼č─▒ml─▒ , saklanan de─čerlerin ├Âzellik setleri gelen de─čerlerin kendisi ile e┼čle┼čtirilmi┼č bir karma tablo gibi bir ┼čey. ├ľrne─čin, "k─▒rm─▒z─▒ araba" kavram─▒, bir ki┼činin hat─▒rlayabildi─či t├╝m k─▒rm─▒z─▒ arabalara e┼člik eder. M├╝kemmel bir haf─▒zas─▒ olan birinin m├╝kemmel bir haritas─▒ var. ├ço─ču insan bu konuda kusurludur (ve ├žo─ču di─čerleri). ─░li┼čkisel harita s─▒n─▒rl─▒ bir kapasiteye sahiptir. E┼člemeler, ├že┼čitli ┼čartlar alt─▒nda (bir bira ├žok fazla) varl─▒─č─▒ndan kopabilir , hatal─▒ bir ┼čekilde kaydedilebilir ("Ben ad─▒ Nettie de─čil, Betty idi") veya ger├že─čin de─či┼čti─čini g├Âzlemlememize ra─čmen asla ├╝zerine yaz─▒lmayabilir (" k─▒rm─▒z─▒ camaro i├žin takas etti─čini ger├žekten bildi─čimizde, araba "turuncu Firebird" u uyar─▒r.

├çorap s├Âz konusu oldu─čunda, m├╝kemmel bir hat─▒rlama, bir ├žoraba bakmak demek, s s├╝rekli olarak yerle┼čtirmek i├žin t yeterli bilgiyi i├žeren (├╝t├╝ masas─▒ ├╝zerindeki nerede) karde┼činin haf─▒zas─▒n─▒ ├╝retir t . Foto─črafik haf─▒zas─▒ olan bir ki┼či, hem 1 hem de 2'yi s├╝rekli olarak hatas─▒z olarak ger├žekle┼čtirir.

M├╝kemmel haf─▒zan─▒n alt─▒nda kalan bir ki┼či, boyutlar─▒n─▒ (papa, anne, bebek), renk (ye┼čilimsi, k─▒rm─▒z─▒ms─▒, vb.), Desen (argyle, d├╝z, vb.) ├ľzelliklerini takip etmek i├žin birka├ž ortak e┼čde─čerlik s─▒n─▒f─▒ kullanabilir. , stil (footie, diz boyu, vb.). B├Âylece ├╝t├╝ masas─▒ kategoriler i├žin b├Âl├╝mlere ayr─▒l─▒r. Bu genellikle kategorinin bellekte sabit bir zamanda bulunmas─▒na izin verir, ancak daha sonra "kova" kategorisinde do─črusal bir arama yap─▒lmas─▒ gerekir.

Haf─▒zas─▒ ve hayal g├╝c├╝ olmayan biri (├╝zg├╝n├╝m) ├žoraplar─▒ bir y─▒─č─▒n halinde tutacak ve t├╝m y─▒─č─▒n─▒ do─črusal bir ┼čekilde ara┼čt─▒racakt─▒r.

D├╝zg├╝n bir ucube, birinin ├Ânerdi─či gibi ├žiftler i├žin say─▒sal etiketler kullanabilir. Bu, bir CPU'yla kullanabilece─čimiz ayn─▒ algoritmalar─▒ kullanabilmeye izin veren toplam bir s─▒ralamaya kap─▒y─▒ a├žar: ikili arama, a─ča├žlar, hasheler, vs.

Bu nedenle, "en iyi" algoritma, onu ├žal─▒┼čt─▒ran ─▒slak malzeme / donan─▒m / yaz─▒l─▒m─▒n niteliklerine ve ├žiftler halinde toplam bir emir uygulayarak "hile yapma iste─čimize" ba─čl─▒d─▒r. Kesinlikle "en iyi" bir meta- algoritma, d├╝nyan─▒n en iyi s─▒ralay─▒c─▒s─▒ olan─▒ i┼če almakt─▒r: sabit zaman aral─▒─č─▒na sahip, 1-1 birle┼čik bellekte b├╝y├╝k bir N set ├žorap ├Âzniteli─či k├╝mesini elde edip h─▒zla depolayabilen bir ki┼či veya makine, ve sil. Hem insanlar hem de bunun gibi makineler tedarik edilebilir. E─čer bir tane varsa, t├╝m ├žoraplar─▒ O (N) zaman─▒nda N ├žiftleri i├žin e┼čle┼čtirebilirsiniz, ki bu idealdir. Toplam sipari┼č etiketi, bir insan veya donan─▒m bilgisayar─▒ ile ayn─▒ sonucu elde etmek i├žin standart karma kullanman─▒za izin verir.


25







Maliyet: Hareketli ├žorap -> y├╝ksek, s─▒ra i├žinde ├žorap bulma / ara -> k├╝├ž├╝k

Yapmak istedi─čimiz ┼čey, hareket say─▒s─▒n─▒ azaltmak ve arama say─▒s─▒n─▒ telafi etmek. Ayr─▒ca, Homo Sapiens'in ├žok i┼č par├žac─▒kl─▒ ortam─▒n─▒, s├╝nnet ├Ânbelle─činde daha fazla ┼čey tutmak i├žin kullanabiliriz.

X = Sevgiler, Y = E┼člerin

T├╝m ├žoraplar─▒n A y─▒─č─▒n─▒ndan:

─░ki ├žorap se├žin, kar┼č─▒l─▒k gelen X ├žoraplar─▒n─▒ X ├žizgisine ve Y ├žoraplar─▒n─▒ Y ├žizgisine bir sonraki uygun konuma yerle┼čtirin.

A bo┼čalana kadar yap─▒n.

Her sat─▒r i├žin X ve Y

  1. Sat─▒rdaki ilk ├žorap se├žin, ilgili ├žorap bulana kadar sat─▒r boyunca aray─▒n.

  2. Uygun bitmi┼č ├žorap hatt─▒na koyun.

  3. ─░ste─če ba─čl─▒ ─░stedi─činiz hatt─▒ ararken ve arad─▒─č─▒n─▒z ge├žerli ├žorap ├Âncekiyle ayn─▒ iken, bu ├žoraplar i├žin 2. ad─▒m─▒ uygulay─▒n.

─░ste─če ba─čl─▒ olarak bir ad─▒m atmak i├žin, ├Ânbellek haf─▒zas─▒ yeterince b├╝y├╝k oldu─čundan, her iki ├žorap da g├Âzlemledi─činiz hatta ge├žerli olanla ayn─▒ olup olmad─▒─č─▒n─▒ h─▒zl─▒ bir ┼čekilde tan─▒mlayabildi─čimiz i├žin, iki yerine o sat─▒rdan iki ├žorap al─▒rs─▒n─▒z. ├ť├ž kolunuz olacak kadar ┼čansl─▒ysan─▒z, konunun haf─▒zas─▒n─▒n yeterince b├╝y├╝k olmas─▒ ko┼čuluyla, ayn─▒ anda ├╝├ž ├žorab─▒ ayr─▒┼čt─▒rabilirsiniz.

Hem X hem de Y bo┼č olana kadar yap─▒n.

Bitti

Bununla birlikte, bu se├žim s─▒ralamada benzer bir karma┼č─▒kl─▒─ča sahip oldu─čundan, G / ├ç (hareketli ├žoraplar) ve arama (bir ├žorap i├žin hatt─▒ arama) h─▒zlar─▒ndan dolay─▒ ge├žen s├╝re ├žok daha azd─▒r.


20







─░┼čte kar┼č─▒la┼čt─▒rma tabanl─▒ modelde bir Omega (n log n) alt s─▒n─▒r─▒. (Ge├žerli olan tek i┼člem iki ├žorap kar┼č─▒la┼čt─▒rmakt─▒r.)

2n ├žoraplar─▒n─▒z─▒n bu ┼čekilde ayarland─▒─č─▒n─▒ bildi─činizi varsayal─▒m :

p 1 p 2 p 3 ... p n p f (1) p f (2) ... p f (n)

f, {1,2, ..., n} k├╝mesinin bilinmeyen bir perm├╝tasyonu. Bunu bilmek sorunu zorla┼čt─▒ramaz. N var! Olas─▒ ├ž─▒kt─▒lar (birinci ve ikinci yar─▒ aras─▒ndaki e┼čle┼čmeler), yani log (n!) = Omega (n log n) kar┼č─▒la┼čt─▒rmalar─▒na ihtiyac─▒n─▒z var. Bu s─▒ralama yoluyla elde edilebilir.

Elemanlar aras─▒ndaki fark problemine ba─člant─▒larla ilgilendi─činiz i├žin: Emega (n log n) 'e elementlerin farkl─▒l─▒─č─▒na ba─čl─▒ oldu─čunu kan─▒tlamak daha zordur, ├ž├╝nk├╝ ├ž─▒kt─▒ ikili evet / hay─▒rd─▒r. Burada, ├ž─▒kt─▒ e┼čle┼čmeli ve olas─▒ ├ž─▒kt─▒ say─▒s─▒ d├╝zg├╝n bir s─▒n─▒r elde etmek i├žin yeterli. Bununla birlikte, elementin belirginli─čine ba─čl─▒ bir de─či┼čken var. 2n ├žorap verildi─čini varsayal─▒m ve benzersiz bir ┼čekilde e┼čle┼čtirilebileceklerini merak edin. ED'den (a 1 , a 2 , ..., a n ) 'a (a 1 , a 1 , 2 , a 2 , ..., a n , a n ) g├Ândererek ED'den indirim alabilirsiniz . (Parentetik olarak, ED'nin sertli─činin kan─▒t─▒, topoloji yoluyla ├žok ilgin├žtir .)

Sadece e┼čitlik testlerine izin verirseniz, as─▒l sorun i├žin ba─čl─▒ bir Omega (n 2 ) olmas─▒ gerekti─čini d├╝┼č├╝n├╝yorum . Sezgim ┼čudur: Bir testten sonra kenar ekledi─činiz bir grafik d├╝┼č├╝n├╝n ve grafik yo─čun de─čilse ├ž─▒kt─▒n─▒n benzersiz bir ┼čekilde belirlenemedi─čini iddia edin.


20







Bu asl─▒nda i├žin, b├Âyle yapar─▒z p ├žorap (├žiftleri n = 2p bireysel ├žorap):

  • Kaz─▒ktan rastgele bir ├žorap al─▒n.
  • ─░lk ├žorap i├žin veya ├Ânceden se├žilen t├╝m ├žoraplar─▒n e┼čle┼čtirilmesi durumunda, ├žoraplar─▒ ├Ân├╝n├╝zdeki e┼čle┼čtirilmemi┼č ├žoraplar─▒n bir "dizisinin" ilk yuvas─▒na yerle┼čtirmeniz yeterlidir.
  • Se├žili bir veya daha fazla e┼čle┼čtirilmemi┼č ├žorap─▒n─▒z varsa, mevcut ├žoraplar─▒n─▒z─▒ dizideki t├╝m e┼čle┼čmemi┼č ├žoraplara kar┼č─▒ kontrol edin.
    • Dizinizi olu┼čtururken ├žoraplar─▒ genel s─▒n─▒flara veya tiplere (beyaz / siyah, ayak bile─či / m├╝rettebat, atletik / elbise) ay─▒rmak ve "sadece benzerini kar┼č─▒la┼čt─▒rmak i├žin" a┼ča─č─▒ya indirmek "m├╝mk├╝nd├╝r.
    • Kabul edilebilir bir e┼čle┼čme bulursan─▒z, her iki ├žorab─▒ bir araya getirin ve diziden ├ž─▒kar─▒n.
    • Bunu yapmazsan─▒z, ge├žerli ├žorap dizideki ilk a├ž─▒k yuvaya yerle┼čtirin.
  • Her ├žorap ile tekrarlay─▒n.

Bu plan─▒n en k├Ât├╝ durum senaryosu ├žorap her ├žifti tam olarak e┼čle┼čmesi gerekti─či konusunda farkl─▒ yeterli oldu─čunu ve ilk olmas─▒d─▒r n / 2 se├žti─činiz ├žorap birbirinden farkl─▒d─▒r. Bu ise O (n 2 ) senaryosu ve bu kadar ├žok olas─▒. E┼čsiz t ├žorap tipinin say─▒s─▒ t ├žiftlerinin say─▒s─▒ndan az ise p = n / 2 , ve her bir tipteki ├žoraplar, bu tip herhangi bir ├žorap ile herhangi bir e┼čle┼čtirilebilecek kadar ayn─▒d─▒r (genellikle a┼č─▒nmaya ba─čl─▒ terimlerle). di─čer, yukar─▒da anla┼č─▒lmaktad─▒r sonra da, hi├ž kar┼č─▒la┼čt─▒rmak zorunda kalacak ├žorap say─▒s─▒d─▒r t sen it sonraki bundan sonra olacak e┼čle┼čmemi┼č ├žorap biriyle e┼čle┼čmesi. Bu senaryo, ortalama ├žorap ├žekmecesinde en k├Ât├╝ durumdan daha muhtemeldir ve en k├Ât├╝ durum karma┼č─▒kl─▒─č─▒n─▒ genellikle t << n olan O (n * t) seviyesine d├╝┼č├╝r├╝r .


18







Ger├žek d├╝nya yakla┼č─▒m─▒:

M├╝mk├╝n oldu─ču kadar ├žabuk, s─▒ralanmam─▒┼č y─▒─č─▒nlardan ├žoraplar─▒ tek tek ├ž─▒kar─▒n ve ├Ân├╝n├╝zdeki y─▒─č─▒nlara yerle┼čtirin. Kaz─▒klar, t├╝m ├žoraplar ayn─▒ y├Âne bakacak ┼čekilde, yerden verimli bir ┼čekilde d├╝zenlenmelidir; Kaz─▒k say─▒s─▒ kolayca ula┼čabilece─činiz mesafeyle s─▒n─▒rl─▒d─▒r. Bir ├žorap koymak i├žin bir kaz─▒k se├žimi, g├Âr├╝n├╝┼čte benzer bir ├žorap y─▒─č─▒n─▒ ├╝zerine bir ├žorap koyarak; zaman zaman tip I (ait olmad─▒─č─▒ bir kaz─▒─ča ├žorap koymak) veya tip II (mevcut bir ├žorap y─▒─č─▒n─▒ oldu─čunda kendi kaz─▒─č─▒na ├žorap koymak) hatas─▒ tolere edilebilir - en ├Ânemli husus h─▒zd─▒r . T├╝m ├žoraplar y─▒─č─▒n halinde oldu─čunda, h─▒zl─▒ bir ┼čekilde ├žift ├žorap yaratan ve bunlar─▒ ├ž─▒kartan ├žok ├žorapl─▒ y─▒─č─▒nlardan ge├žerler (bunlar ├žekmeceye do─čru gidiyor). Kaz─▒kta e┼čle┼čen ├žoraplar varsa, bunlar─▒ en iyi ┼čekilde (m├╝mk├╝n oldu─ču kadar ├žabuk k─▒s─▒tlama dahilinde) kaz─▒klara yeniden yerle┼čtirin. T├╝m ├žoklu ├žorap y─▒─č─▒nlar─▒ i┼člendi─činde, II tipi hatalar nedeniyle e┼čle┼čtirilmemi┼č kalan ├žorab─▒n kalan ├žoraplar─▒n─▒ e┼čle┼čtirin. Vay, bitti - ve ├žok fazla ├žorab─▒m var ve b├╝y├╝k bir k─▒sm─▒ kirli olana kadar onlar─▒ y─▒kamay─▒n. Bir di─čer pratik not: Elastik ├Âzelliklerinden yararlanarak, bir ├žift ├žorab─▒n ├╝st├╝n├╝ di─čerinin ├╝zerine ├ževiriyorum, b├Âylece ├žekmeceye ta┼č─▒n─▒rken ve ├žekmecedeyken birlikte kal─▒yorlar.


16







Sorunuzdan ├žama┼č─▒rlar─▒n─▒zla ilgili ger├žek bir deneyiminiz olmad─▒─č─▒ a├ž─▒k. :). Az say─▒da ├žiftle┼čilemeyen ├žorapla iyi ├žal─▒┼čan bir algoritmaya ihtiyac─▒n─▒z var.

┼×imdiye kadar verilen cevaplar insan ├Âr├╝nt├╝ tan─▒ma yeteneklerimizden pek de faydalanm─▒yor. Set oyunu, bunun nas─▒l iyi yap─▒laca─č─▒na dair bir ipucu sa─člar: t├╝m ├žoraplar─▒ iki boyutlu bir alana koyun, b├Âylece hem onlar─▒ iyi tan─▒yabilir hem de elinizle kolayca ula┼čabilirsiniz. Bu, sizi yakla┼č─▒k 120 x 80 cm'lik bir alana s─▒n─▒rlar. Oradan tan─▒d─▒─č─▒n─▒z ├žiftleri se├žin ve kald─▒r─▒n. Bo┼č alana fazladan ├žoraplar koyun ve tekrarlay─▒n. Kolayca tan─▒nabilen ├žoraplar─▒ olan insanlar─▒ y─▒karsan─▒z (k├╝├ž├╝k ├žocuklar akla gelir), ├Ânce bu ├žoraplar─▒ se├žerek bir radix s─▒ralama yapabilirsiniz. Bu algoritma yaln─▒zca tek ├žoraplar─▒n say─▒s─▒ d├╝┼č├╝k oldu─čunda i┼če yarar


14







─░lk ├žorab─▒ al ve masaya koy. ┼×imdi ba┼čka bir ├žorap se├žin; ilk se├žilenle e┼čle┼čiyorsa, ilk olan─▒n ├╝st├╝ne yerle┼čtirin. De─čilse, masaya ilkinden k├╝├ž├╝k bir mesafede yerle┼čtirin. ├ť├ž├╝nc├╝ bir ├žorap se├žin; ├Ânceki ikisinden biriyle e┼čle┼čirse, ├╝stlerine yerle┼čtirin veya ├╝├ž├╝nc├╝s├╝ne k├╝├ž├╝k bir mesafe koyun. T├╝m ├žoraplar─▒ alana kadar tekrarlay─▒n.


14







├çoraplar─▒ bir y─▒─č─▒ndan e┼čle┼čtirmenin ne kadar verimli oldu─čunu s├Âylemek i├žin, ├Ânce makineyi tan─▒mlamam─▒z gerekir, ├ž├╝nk├╝ e┼čle┼čtirme, bir turing ile veya normal olarak bir temel olarak kullan─▒lan rasgele bir eri┼čim makinesi ile yap─▒lmaz. algoritmik analiz.

Makine

Makine, insan denilen ger├žek d├╝nya unsurunun bir soyutlamas─▒d─▒r. ├çevreden bir ├žift g├Âzle okuyabiliyor. Makine modelimiz ├ževreyi 2 kol kullanarak da de─či┼čtirebiliyor. Mant─▒ksal ve aritmetik i┼člemler beynimiz kullan─▒larak hesaplan─▒r (umar─▒m ;-)).

Ayr─▒ca bu cihazlarla ger├žekle┼čtirilebilecek atomik i┼člemlerin ger├žek ├žal─▒┼čma zaman─▒n─▒ da g├Âz ├Ân├╝nde bulundurmal─▒y─▒z. Fiziksel k─▒s─▒tlamalar nedeniyle, bir kol veya g├Âz taraf─▒ndan ger├žekle┼čtirilen operasyonlar sabit zaman karma┼č─▒kl─▒─č─▒na sahiptir. Bunun nedeni, sonsuz b├╝y├╝k bir ├žorap y─▒─č─▒n─▒n─▒ bir kolla hareket ettiremememiz veya ├╝stteki ├žoraplar─▒ sonsuz b├╝y├╝k bir ├žorap y─▒─č─▒n─▒ ├╝zerinde g├Ârmememizdir.

Ancak mekanik fizik bize baz─▒ g├╝zellikler de veriyor. Bir kolla en fazla bir ├žorab─▒ hareket ettirmekle s─▒n─▒rl─▒ de─čiliz. Birka├ž tanesini ayn─▒ anda ta┼č─▒yabiliriz.

Bu nedenle ├Ânceki analize ba─čl─▒ olarak a┼ča─č─▒daki i┼člemler azalan s─▒rayla kullan─▒lmal─▒d─▒r:

  • mant─▒ksal ve aritmetik i┼člemler
  • ├ževre okur
  • ├ževresel de─či┼čiklikler

─░nsanlar─▒n yaln─▒zca s─▒n─▒rl─▒ miktarda ├žorab─▒n oldu─ču ger├že─činden de faydalanabiliriz. Bu y├╝zden ├ževresel bir de─či┼čiklik kaz─▒ktaki t├╝m ├žoraplar─▒ i├žerebilir.

Algoritmas─▒

─░┼čte benim ├Ânerim:

  1. T├╝m ├žoraplar─▒ yere y─▒─č─▒n.
  2. Yerdeki ├žoraplara bakarak bir ├žift bulun.
  3. Hi├žbir ├žift yap─▒lamayacak kadar 2 ile tekrarlay─▒n.
  4. Zeminde ├žorap kalmay─▒ncaya kadar 1'den tekrarlay─▒n.

─░┼člem 4 gereklidir, ├ž├╝nk├╝ ├žoraplar─▒ yere sererken baz─▒ ├žoraplar di─čerlerini gizleyebilir. Algoritman─▒n analizi:

Analiz

Algoritma y├╝ksek olas─▒l─▒kla sona ermektedir. Bu, 2 numaral─▒ ad─▒mda birinin ├žorap ├žiftini bulamamas─▒ndan kaynaklanmaktad─▒r.

n ├çorap ├žiftlerinin a┼ča─č─▒daki ├žal─▒┼čma zaman─▒ analizi i├žin , ├žoraplar─▒n en az yar─▒s─▒n─▒n 2n 1. ad─▒mdan sonra gizlenmedi─čini varsayal─▒m . Yani ortalama bir durumda n/2 ├žiftleri bulabiliriz . Bu, d├Âng├╝n├╝n 4. ad─▒m─▒n y├╝r├╝t├╝ld├╝─č├╝ anlam─▒na gelir O(log n) . 2. Ad─▒m, y├╝r├╝t├╝l├╝r O(n^2) s├╝releri. B├Âylece sonu├žland─▒rabiliriz:

  • Algoritma O(ln n + n) ├ževresel de─či┼čiklikleri i├žerir (ad─▒m 1 O(ln n) art─▒ her ├žorab─▒n tabandan toplanmas─▒)
  • Algoritma, O(n^2) 2. ad─▒mdaki ├ževresel okumalar─▒ i├žerir
  • Algoritma, O(n^2) bir basama─č─▒n bir basama─ča basama─č─▒yla kar┼č─▒la┼čt─▒r─▒lmas─▒ i├žin mant─▒ksal ve aritmetik i┼člemleri i├žerir

Bu nedenle , makul miktarda ├žorap i├žin s─▒ras─▒yla ├ževresel okuma ve ├ževresel yazma i┼člemleri i├žin fakt├Ârlerin O(r*n^2 + w*(ln n + n)) nerede r ve nerede w olduklar─▒n─▒n toplam bir ├žal─▒┼čma zaman─▒ karma┼č─▒kl─▒─č─▒na sahibiz . Mant─▒ksal ve aritmetik i┼člemlerin maliyeti g├Âz ard─▒ edilir, ├ž├╝nk├╝ 2 ├žorab─▒n ayn─▒ ├žifte ait olup olmad─▒─č─▒na karar vermek i├žin sabit miktarda mant─▒ksal ve aritmetik i┼člem yap─▒lmas─▒ gerekti─čini varsayal─▒m. Bu, her senaryoda uygun olmayabilir.


12







 List<Sock> UnSearchedSocks = getAllSocks();
List<Sock> UnMatchedSocks = new list<Sock>();
List<PairOfSocks> PairedSocks = new list<PairOfSocks>();

foreach (Sock newSock in UnsearchedSocks)
{
  Sock MatchedSock = null;
  foreach(Sock UnmatchedSock in UnmatchedSocks)
  {
    if (UnmatchedSock.isPairOf(newSock))
    {
      MatchedSock = UnmatchedSock;
      break;
    }
  }
  if (MatchedSock != null)
  {
    UnmatchedSocks.remove(MatchedSock);
    PairedSocks.Add(new PairOfSocks(MatchedSock, NewSock));
  }
  else
  {
    UnmatchedSocks.Add(NewSock);
  }
}
 

12







Daha az i┼člem vaat etmeyecek ba┼čka bir ├ž├Âz├╝mle ortaya ├ž─▒kt─▒m, ne daha az zaman t├╝ketimi, ne de daha az zaman harcamay─▒ tercih ettim, ancak devasa ├žorap e┼čle┼čtirme serisinde daha az zaman t├╝ketimi sa─člamak i├žin yeterince iyi bir bulu┼čsal olup olmad─▒─č─▒n─▒ g├Ârmeye ├žal─▒┼č─▒lmal─▒d─▒r.

├ľn ko┼čullar: Ayn─▒ ├žoraplar─▒n bulundu─čunun garantisi yoktur. Ayn─▒ renge sahiplerse, ayn─▒ boyuta veya desene sahip olduklar─▒ anlam─▒na gelmez. ├çoraplar rastgele kar─▒┼čt─▒r─▒l─▒r. Tek say─▒da ├žorap olabilir (baz─▒lar─▒ eksik, ka├ž tane oldu─čunu bilmiyoruz). Bir "index" de─či┼čkenini hat─▒rlamaya haz─▒rlan─▒n ve 0 olarak ayarlay─▒n.

Sonu├žta bir veya iki y─▒─č─▒n olacakt─▒r: 1. "e┼čle┼čti" ve 2. "eksik"

Sezgisel:

  1. En belirgin ├žorap bulun.
  2. E┼čle┼čmesini bul.
  3. E┼čle┼čme yoksa, "kay─▒p" y─▒─č─▒na koyun.
  4. Daha belirgin ├žoraplar olana kadar 1.'den itibaren tekrarlay─▒n.
  5. 6 ├žoraptan azsa 11'e gidin.
  6. T├╝m ├žoraplar─▒ k├Âr├╝ne kom┼ču olarak e┼čle┼čtirin (paketlemeyin)
  7. T├╝m e┼čle┼čen ├žiftleri bulun, paketleyin ve dolu ├žiftleri "e┼čle┼čen" y─▒─č─▒na ta┼č─▒y─▒n; Yeni e┼čle┼čme yoksa - "endeks" i 1 artt─▒r
  8. E─čer "indeks" 2'den b├╝y├╝kse (bu, ├žorap say─▒s─▒na ba─čl─▒ olabilir, ├ž├╝nk├╝ daha fazla say─▒da ├žorap ile onlar─▒ k├Ârle┼čtirmek i├žin daha az ┼čans vard─▒r) 11'e gidin.
  9. Gerisini kar─▒┼čt─▒r
  10. 1ÔÇÖe git
  11. "Dizini" unut
  12. Bir ├žorap se├ž
  13. Çiftini bulun
  14. ├çorap i├žin ├žift yoksa, onu "eksik" y─▒─č─▒na ta┼č─▒y─▒n
  15. E┼čle┼čme bulunduysa, ├žifti e┼čle┼čtirin, e┼čle┼čtirin ve "e┼čle┼čen" y─▒─č─▒na ta┼č─▒y─▒n
  16. Hala daha varsa, bir ├žorap 12
  17. Sadece bir tane kald─▒ysa 14'e gidin
  18. G├╝l├╝mse memnun :)

Ayr─▒ca, sanki ├ž─▒kar─▒lan sanki, hasarl─▒ ├žoraplar─▒ da kontrol edebilir. 2 ile 3 aras─▒nda ve 13 ile 14 aras─▒nda yerle┼čtirilebilir.

Herhangi bir deneyim veya d├╝zeltmelerden haberdar olmak i├žin sab─▒rs─▒zlan─▒yorum.


12







├çoraplar─▒ s─▒ralad─▒─č─▒mda , ayn─▒ renk / desen tipindeki di─čer ├žoraplar─▒n yan─▒na ├žorap b─▒rakarak yakla┼č─▒k bir radix s─▒ralamas─▒ yapar─▒m . Konumun yak─▒n─▒nda veya yak─▒n─▒nda tam bir e┼čle┼čme g├Ârebildi─čim durumlar haricinde, ├žoraplar─▒ b─▒rakmak ├╝zereyim Parite bu noktada ├ž─▒kar─▒m.

Hemen hemen t├╝m di─čer algoritmalar ( usr taraf─▒ndan en iyi puanlama cevab─▒ dahil ) s─▒ralan─▒r, ard─▒ndan ├žiftleri kald─▒r─▒r. Bir insan olarak, bir kerede d├╝┼č├╝n├╝len ├žorap say─▒s─▒n─▒ en aza indirmenin daha iyi oldu─čunu d├╝┼č├╝n├╝yorum.

Bunu taraf─▒ndan yap─▒yorum:

  1. Ay─▒rt edici bir ├žorap se├žmek (kaz─▒kta ilk ├Ânce g├Âz├╝me ├žarpan ne varsa).
  2. Kavramsal konumdan bir yar─▒├žap dizisi ba┼člatmak, benzer olana ba─čl─▒ olarak t├╝yleri ├žoraplardan ├žekerek.
  3. Yeni ├žoraplar─▒ mevcut y─▒─č─▒n─▒n yak─▒n─▒na, ne kadar farkl─▒ oldu─čuna ba─čl─▒ olarak yerle┼čtirin. Kendinizi ayn─▒ oldu─čundan ├žorab─▒ kendinizin ├╝st├╝ne koyarsan─▒z, oradaki ├žifti kurun ve ├ž─▒kar─▒n. Bu, gelecekteki kar┼č─▒la┼čt─▒rmalar─▒n do─čru yeri bulmak i├žin daha az ├žaba harcad─▒─č─▒ anlam─▒na gelir.

Bu, insan─▒n O (1) zamanda bulan─▒k e┼čle┼čme yetene─činden faydalan─▒r; bu, bir hesaplama cihaz─▒nda bir karma haritan─▒n kurulmas─▒na biraz e┼čde─čerdir.

├ľnce ay─▒rt edici ├žoraplar─▒ ├žekerek, daha az ay─▒rt edici olan ├Âzelliklere ba┼člamak i├žin "yak─▒nla┼čt─▒rmak" i├žin bo┼čluk b─▒rak─▒n.

Floro rengini, ├žizgili ├žoraplar─▒ ve ├ž ├žift uzun ├žorab─▒ elimine ettikten sonra, ne kadar giyildiklerine g├Âre kabaca dizilmi┼č olan ├žo─čunlukla beyaz ├žoraplarla kar┼č─▒la┼čabilirsiniz.

Bir noktada, ├žoraplar aras─▒ndaki farklar di─čer insanlar─▒n fark─▒ fark etmeyecekleri kadar k├╝├ž├╝kt├╝r ve daha fazla e┼čle┼čtirme ├žabas─▒na gerek yoktur.


11







Ne zaman bir ├žorap toplarsan, bir yere koy. Sonra bir sonraki ├žorap, ilk ├žorapla uyu┼čmuyorsa, birincinin yan─▒na koyun. Olursa, bir ├žift var. Bu ┼čekilde ne kadar kombinasyon oldu─čunun ├Ânemi yoktur ve toplad─▒─č─▒n─▒z her ├žorap i├žin sadece iki olas─▒l─▒k vard─▒r - ya zaten ├žorap dizinizdeki bir e┼čle┼čmeye sahiptir, ya da ├Âyle demek de─čildir. dizideki bir yere ekleyin.

Bu ayn─▒ zamanda dizideki neredeyse t├╝m ├žoraplar─▒n─▒z─▒ kesinlikle kullanamayaca─č─▒n─▒z anlam─▒na gelir, ├ž├╝nk├╝ ├žoraplar e┼čle┼čtik├že ├ž─▒kar─▒lacakt─▒r.


10







Ger├žek olanlar veya baz─▒ analog veri yap─▒lar─▒ olsun olmas─▒n, ├žoraplar ├žiftler halinde tedarik edilirdi.

En basit cevap, ├žiftin ayr─▒lmas─▒na izin vermeden ├Ânce, ├žiftin sol ve sa─č ├žorab─▒na bir i┼čaret├ži i├žeren tek bir veri yap─▒s─▒n─▒n ba┼člat─▒lmas─▒ ve b├Âylece ├žoraplar─▒n do─črudan veya ├žiftleri arac─▒l─▒─č─▒yla y├Ânlendirilmesini sa─člamakt─▒r. Bir ├žorap, orta─č─▒na bir i┼čaret├ži i├žerecek ┼čekilde geni┼čletilebilir.

Bu, herhangi bir hesaplama e┼čle┼čtirme problemini bir soyutlama katman─▒ ile kald─▒rarak ├ž├Âzer.

Ayn─▒ fikri e┼čle┼čtirme ├žoraplar─▒n─▒n pratik problemine uygularken, g├Âr├╝nen cevap ┼čudur: ├žoraplar─▒n─▒z─▒n hi├ž e┼čle┼čtirilmemesine izin vermeyin. ├çoraplar bir ├žift olarak temin edilir, ├žekmeceye bir ├žift olarak konur (belki birlikte toplanarak), bir ├žift olarak giyilir. Ancak, e┼čle┼čmenin m├╝mk├╝n olmad─▒─č─▒ nokta ├žama┼č─▒r makinesinde oldu─ču i├žin tek gereken, ├žoraplar─▒n birlikte kalmas─▒n─▒ ve verimli bir ┼čekilde y─▒kanmas─▒n─▒ sa─člayan fiziksel bir mekanizmad─▒r.

─░ki fiziksel olas─▒l─▒k var:

Her ├žorab─▒n imlecini tutan '├žift' bir nesne i├žin, ├žoraplar─▒ bir arada tutmak i├žin kulland─▒─č─▒m─▒z bir bez torbam─▒z olabilir. Bu b├╝y├╝k y├╝k├╝ gibi g├Âr├╝n├╝yor.

Ancak her bir ├žorap di─čerine at─▒fta bulunmak i├žin temiz bir ├ž├Âz├╝m var: bir popper (ya da Amerikal─▒ysan─▒z 'basma d├╝─čmesi'), ├Ârne─čin:

http://www.aliexpress.com/compare/compare-invisible-snap-buttons.html

O zaman tek yapman─▒z gereken, ├žoraplar─▒n─▒z─▒ ├ž─▒kard─▒ktan ve ├žama┼č─▒r sepetinize koyman─▒z─▒n hemen ard─▒ndan ├žoraplar─▒n─▒z─▒ bir araya getirmek ve yine ├žoraplar─▒n─▒z─▒ '├žift' kavram─▒n─▒n fiziksel bir soyutlamas─▒yla e┼čle┼čtirme ihtiyac─▒n─▒ ortadan kald─▒rd─▒n─▒z.


10







'N' boyutunda bir karma tablo d├╝┼č├╝n├╝n.

Normal da─č─▒l─▒m varsayarsak, en az bir kep├žeye e┼členmi┼č bir ├žorab─▒n sahip oldu─ču tahmini ÔÇťeklemeÔÇŁ say─▒s─▒ NlogN'dir (yani t├╝m kep├želer dolu)

Bunu ba┼čka bir bulmacan─▒n par├žas─▒ olarak t├╝retmi┼čtim, ancak yanl─▒┼č oldu─čunu kan─▒tlamaktan mutluluk duyar─▒m. ─░┼čte ayn─▒ benim blog makalem

'N', sahip oldu─čunuz ├žoraplar─▒n benzersiz renk / desen say─▒s─▒na g├Âre yakla┼č─▒k bir ├╝st s─▒n─▒ra kar┼č─▒l─▒k gelsin.

├çarp─▒┼čmadan sonra (aka: bir e┼čle┼čme) bu ├žorab─▒n─▒ kald─▒r. Ayn─▒ deneyi bir sonraki NlogN ├žorap grubu ile tekrarlay─▒n. Bunun g├╝zelli─či, insan zihninin ├žal─▒┼čma ┼čekli nedeniyle NlogN ile paralel kar┼č─▒la┼čt─▒rmalar yapabilmenizdir (├žarp─▒┼čma ├ž├Âz├╝n├╝rl├╝─č├╝). :-)


9







O (1) zaman alan bir s├╝rece olan ├žabam─▒ azaltmak i├žin basit ad─▒mlar att─▒m.

Girdilerimi iki t├╝r ├žoraptan birine (rekreasyon i├žin beyaz ├žoraplar, i┼č i├žin siyah ├žoraplar) d├╝┼č├╝rerek, sadece elimde iki ├žoraptan birini belirlemem gerekir. (Teknik olarak, asla birlikte y─▒kanmad─▒klar─▒ i├žin, i┼člemi O (0) zamana d├╝┼č├╝rd├╝m)

─░stenilen ├žoraplar─▒ bulmak ve mevcut ├žoraplar─▒n─▒za olan ihtiyac─▒ ortadan kald─▒rmak i├žin yeterli miktarda sat─▒n almak i├žin biraz ├žaba sarfedilmesi gerekir. Bunu siyah ├žoraplara ihtiyac─▒mdan ├Ânce yapt─▒─č─▒m gibi ├žabam azd─▒, ancak kilometre de─či┼čebilir.

Bu kadar a├ž─▒k bir ├žaba, ├žok pop├╝ler ve etkili kodlarda bir├žok kez g├Âr├╝lm├╝┼čt├╝r. ├ľrnekler aras─▒nda # ondal─▒k tan─▒mlamak i├žin birka├ž ondal─▒k basama─č─▒ bulunur (di─čer ├Ârnekler var, fakat ┼ču anda akla gelen ┼čey bu).


8







"Ta┼č─▒" i┼člemi olduk├ža pahal─▒ysa ve "kar┼č─▒la┼čt─▒r" i┼člemi ucuzsa ve t├╝m k├╝meyi yine de araman─▒n orijinal depolama alan─▒ndan ├žok daha h─▒zl─▒ oldu─ču bir arabellek i├žine ta┼č─▒man─▒z gerekiyorsa, s─▒ralamay─▒ zorunlu hale getirin hareket.

Kurumaya as─▒l─▒ kalma s├╝recinin b├╝t├╝nle┼čtirilmesini bir esinti yapar buldum. Her bir ├žorab─▒ yine de almam ve asmam (hareket et) ve tellerin ├╝zerinde belirli bir yere asman─▒n hi├žbir maliyeti yok. ┼×imdi sadece b├╝t├╝n tamponu aramaya zorlamamak (teller) ├žoraplar─▒ renk / g├Âlge ile yerle┼čtirmeyi tercih ediyorum. Daha koyu sola, daha parlak sa─ča, daha renkli ├Ân vb. ┼×imdi, her ├žorab─▒ asmadan ├Ânce, e┼čle┼čen bir tane varsa, "do─čru yak─▒n─▒na" bakar─▒m - bu, 2-3 taramay─▒ "taramay─▒" - ve varsa , Di─čerini hemen yan─▒na as─▒yorum. Daha sonra kurudu─čunda tellerden ├ž─▒kar─▒rken onlar─▒ ├žiftler halinde yuvarlar─▒m.

┼×imdi bu, en iyi yan─▒tlar─▒n ├Ânerdi─či "renge g├Âre y─▒─č─▒n olu┼čturma" dan farkl─▒ g├Âr├╝nm├╝yor, ama ├Ânce, ayr─▒k y─▒─č─▒nlar─▒ se├žmeden de─čil, aral─▒klarla, "mor" un "k─▒rm─▒z─▒" ya da "mavi" y─▒─č─▒na gidip gitmeyece─čini s─▒n─▒fland─▒rmada hi├žbir problemim yok; Sadece aras─▒nda gider. Ve sonra iki i┼člemi b├╝t├╝nle┼čtirerek (kurumak ve s─▒ralamak), as─▒l─▒yken s─▒ralaman─▒n eki, ayr─▒ s─▒ralaman─▒n ne olaca─č─▒n─▒n% 10'u kadard─▒r.


8







┼×u an ├žoraplar─▒m─▒ e┼čle┼čtirmeyi bitirdim ve bunu yapman─▒n en iyi yolunun a┼ča─č─▒daki oldu─čunu buldum:

  • ├çoraplardan birini se├žip uza─ča koyun (bu ├žift i├žin bir 'kova' olu┼čturun)
  • Bir sonrak bir ├Âncekinin ├žifti ise, mevcut kovana koyun, aksi takdirde yeni bir tane olu┼čturun.

En k├Ât├╝ durumda, n / 2 farkl─▒ kovaya sahip olaca─č─▒n─▒z ve hangi kep├ženin mevcut ├žorab─▒n ├žiftini i├žerdi─či hakk─▒nda n-2 tespitine sahip olaca─č─▒n─▒z anlam─▒na gelir. A├ž─▒k├žas─▒, bu algoritma sadece birka├ž ├žiftiniz varsa i┼če yarar; 12 ├žift ile yapt─▒m.

├çok bilimsel de─čil, ama iyi ├žal─▒┼č─▒yor :)


8







Benim ├ž├Âz├╝m├╝m resmen O(n) "ekstra" alan gerektirdi─či i├žin gereksinimlerinize tam olarak uymuyor . Ancak, uygulamamdaki ko┼čullar─▒m dikkate al─▒nd─▒─č─▒nda ├žok etkilidir. Bu nedenle ilgin├ž olmas─▒ gerekti─čini d├╝┼č├╝n├╝yorum.

Di─čer G├Ârevlerle Birle┼čtir

Benim durumumdaki ├Âzel durum kurutma makinesini kullanmamam, bezlerimi s─▒radan bir bez kurutucuya asmak. Bezleri asmak O(n) i┼člemleri gerektirir (bu arada, her zaman ├ž├Âp kutusu problemini burada g├Âz ├Ân├╝nde bulundururum ) ve do─čas─▒ gere─či problem, lineer "ekstra" alan gerektirir. Kovadan yeni bir ├žorap ├žekti─čimde, ├žift zaten as─▒lm─▒┼čsa, ├žiftinin yan─▒na asmay─▒ denemek isterim. E─čer yeni bir ├žiftten yap─▒lm─▒┼č bir ├žorap varsa, yan─▒na biraz bo┼čluk b─▒rak─▒r─▒m.

Oracle Makine Daha ─░yi ;-)

A├ž─▒k├žas─▒ zaten bir yerde as─▒l─▒ e┼čle┼čen ├žorap olup olmad─▒─č─▒n─▒ kontrol etmek i├žin bir miktar ekstra ├žal─▒┼čma gerektirir ve bir bilgisayar i├žin O(n^2) yakla┼č─▒k katsay─▒s─▒ 1/2 olan bir ├ž├Âz├╝m sunar . Ancak bu durumda ÔÇťinsan fakt├Âr├╝ÔÇŁ asl─▒nda bir avantajd─▒r - O(1) e─čer zaten as─▒lm─▒┼čsa (muhtemelen baz─▒ alg─▒lanamaz beyin i├ži ├Ânbelleklenme s├Âz konusudur) genellikle ├žok h─▒zl─▒ bir ┼čekilde (neredeyse ) e┼čle┼čen ├žoraplar─▒ belirleyebilirim. Oracle Machine'de oldu─ču gibi s─▒n─▒rl─▒ "oracle" ;-) Biz, baz─▒ durumlarda dijital makinelere g├Âre insanlar bu avantajlara sahipler ;-)

Neredeyse var O(n) !

Bu nedenle, ├žoraplar─▒ e┼čle┼čtirme ask─▒s─▒ ile ba─člama sorununu O(n) ├╝cretsiz olarak "fazladan alan" al─▒yorum ve O(n) zamanla ortaya ├ž─▒kan bir ├ž├Âz├╝me sahibim , basit as─▒l─▒ kuma┼člardan biraz daha fazla i┼č gerektiren ve derhal tam ├žiftine eri┼čime izin veren bir ├ž├Âz├╝me sahibim . Pazartesi sabah─▒ bile ├žok k├Ât├╝ bir ├žorap ... ;-)


8







Umar─▒m bu soruna yeni bir ┼čey ekleyebilirim. T├╝m cevaplar─▒n , genel ├žama┼č─▒r y─▒kama performans─▒n─▒z─▒ yava┼člatmadan ├Ân i┼čleme yapabilmeniz i├žin iki nokta bulundu─čunu ihmal etti─čini fark ettim .

Ayr─▒ca, b├╝y├╝k aileler i├žin bile ├žok say─▒da ├žorap almam─▒z gerekmez. ├çoraplar ├žekmeceden ├ž─▒kar─▒l─▒r ve giyilir ve sonra aklanmadan ├Ânce kald─▒klar─▒ bir yere at─▒l─▒r (belki bir ├ž├Âp kutusu). Ben bir bin LIFO-Y─▒─č─▒n─▒ demesem de, bunu varsayman─▒n g├╝venli oldu─čunu s├Âyleyebilirim.

  1. insanlar her iki ├žoraplar─▒n─▒ da kab─▒n ayn─▒ b├Âlgesinde f─▒rlat─▒rlar,
  2. ├ž├Âp kutusu herhangi bir noktada randomize de─čildir ve bu nedenle
  3. Bu kutunun tepesinden al─▒nan herhangi bir alt k├╝me genellikle bir ├žiftin her iki ├žorap─▒n─▒ da i├žerir.

Tan─▒mad─▒─č─▒m t├╝m ├žama┼č─▒r makinelerinin boyutlar─▒ s─▒n─▒rl─▒ oldu─čundan (ka├ž tane ├žorap y─▒kaman─▒z gerekti─čine bak─▒lmaks─▒z─▒n) ve as─▒l rastgele y─▒kama i┼člemi ├žama┼č─▒r makinesinde ger├žekle┼čti─činden, ne kadar ├žorab─▒m─▒z olursa olsun, hemen hemen hi├ž i├žermeyen k├╝├ž├╝k alt gruplar─▒m─▒z vard─▒r. singletonlar─▒n.

─░ki ├Ân i┼čleme a┼čamam─▒z ÔÇť├žoraplar─▒ ├žama┼č─▒r hatt─▒na koymakÔÇŁ ve ÔÇť├žoraplar─▒ ├žama┼č─▒r hatt─▒ndan almakÔÇŁ, sadece temiz de─čil ayn─▒ zamanda kuru ├žorap almak i├žin yapmak zorunday─▒z. ├çama┼č─▒r makinelerinde oldu─ču gibi ├žama┼č─▒r ipleri s─▒n─▒rl─▒ ve ├žoraplar─▒m─▒z─▒ g├Âr├╝nd├╝─č├╝m├╝z yerin tamam─▒na sahip oldu─čumuzu varsay─▒yorum.

─░┼čte put_socks_on_line () i├žin algoritma:

 while (socks left in basket) {
 take_sock();
 if (cluster of similar socks is present) { 
   Add sock to cluster (if possible, next to the matching pair)
 } else {
  Hang it somewhere on the line, this is now a new cluster of similar-looking socks.      
  Leave enough space around this sock to add other socks later on 
 }
}
 

├çoraplar─▒n─▒z─▒ etrafta gezdirmek veya en iyi e┼čle┼čmeyi aramak i├žin zaman─▒n─▒z─▒ bo┼ča harcamay─▒n, bunlar─▒n hepsi s─▒raya koymak i├žin ihtiya├ž duydu─čumuz O (n) 'de yap─▒lmal─▒d─▒r. ├çoraplar hen├╝z e┼čle┼čmedi, hatta birka├ž tane benzerlik k├╝memiz var. Burada s─▒n─▒rl─▒ bir ├žorap grubumuz olmas─▒ yararl─▒d─▒r, ├ž├╝nk├╝ bu "iyi" k├╝meler olu┼čturmam─▒za yard─▒mc─▒ olur (├Ârne─čin, ├žorap k├╝mesinde yaln─▒zca siyah ├žoraplar varsa, renklerle k├╝meleme gitmek olmaz)

─░┼čte take_socks_from_line () i├žin algoritma:

 while(socks left on line) {
 take_next_sock();
 if (matching pair visible on line or in basket) {
   Take it as well, pair 'em and put 'em away
 } else {
   put the sock in the basket
 }
 

Kalan ad─▒mlar─▒n h─▒z─▒n─▒ artt─▒rmak i├žin, s─▒radaki ├žoraplar─▒ rastgele se├žmemek, ancak her k├╝meden ├žoraplar─▒n s─▒rayla ├žoraplar─▒n─▒ almak ak─▒ll─▒ca olacakt─▒r. Her iki ├Ân i┼čleme basama─č─▒, ne olursa olsun yapmam─▒z gereken ├žoraplar─▒ hatta hatta sepete koymaktan daha fazla zaman almaz, bu nedenle ├žama┼č─▒r y─▒kama performans─▒n─▒ b├╝y├╝k ├Âl├ž├╝de artt─▒rmal─▒d─▒r.

Bundan sonra, hash b├Âl├╝mleme algoritmas─▒n─▒ yapmak kolayd─▒r. Genellikle, ├žoraplar─▒n yakla┼č─▒k% 75'i zaten ├žok k├╝├ž├╝k bir ├žorap alt k├╝mesini b─▒rakarak e┼čle┼čtirildi ve bu alt k├╝me zaten (biraz) k├╝melendi (├Ân i┼čleme ad─▒mlar─▒ndan sonra sepetime fazla entropi eklemem). Di─čer bir ┼čey, kalan k├╝melerin bir kerede ele al─▒nacak kadar k├╝├ž├╝k olma e─čiliminde olmalar─▒d─▒r, b├Âylece b├╝t├╝n bir k├╝meyi sepetten ├ž─▒karmak m├╝mk├╝nd├╝r.

Sort_remaining_clusters () i├žin algoritma:

 while(clusters present in basket) {
  Take out the cluster and spread it
  Process it immediately
  Leave remaining socks where they are
}
 

Bundan sonra, sadece birka├ž ├žorap kald─▒. Buras─▒ daha ├Ânce e┼čle┼čtirilmemi┼č ├žoraplar─▒ sisteme soktu─čum ve kalan ├žoraplar─▒ herhangi bir ├Âzel algoritma olmadan i┼čledi─čim yerdir - kalan ├žoraplar ├žok azd─▒r ve g├Ârsel olarak ├žok h─▒zl─▒ bir ┼čekilde i┼členebilir.

Kalan t├╝m ├žoraplar i├žin, meslekta┼člar─▒n─▒n hala y─▒kanmam─▒┼č oldu─čunu ve bir sonraki yineleme i├žin onlar─▒ uzakla┼čt─▒rd─▒─č─▒n─▒ varsay─▒yorum. Zamanla e┼čle┼čmemi┼č ├žoraplar─▒n b├╝y├╝mesini kaydederseniz (bir "├žorap s─▒z─▒nt─▒s─▒"), ├ž├Âp kutunuzu kontrol etmelisiniz - rastgele olabilir (orada uyuyan kedileriniz var m─▒?)

Bu algoritmalar─▒n ├žok fazla varsay─▒m gerektirdi─čini biliyorum: bir ├že┼čit LIFO y─▒─č─▒n─▒, s─▒n─▒rl─▒, normal bir ├žama┼č─▒r makinesi ve s─▒n─▒rl─▒, normal bir ├žama┼č─▒r ipi gibi davranan bir ├ž├Âp kutusu - ama bu hala ├žok say─▒da ├žorapla ├žal─▒┼č─▒yor.

Paralellik hakk─▒nda: Her iki ├žorab─▒ ayn─▒ kutuya att─▒─č─▒n─▒z s├╝rece, bu ad─▒mlar─▒n t├╝m├╝n├╝ kolayca paralel hale getirebilirsiniz.


8







Deseni karma olarak kullanarak, e┼čsiz ├žoraplar i├žin kullan─▒lacak bir karma tablo olu┼čturun. ├çoraplar─▒ teker teker tekrarlay─▒n. ├çorab─▒n karma masada bir desen e┼čle┼čmesi varsa, ├žorab─▒ masadan ├ž─▒kar─▒n ve bir ├žift yap─▒n. ├çorab─▒n kibriti yoksa, masaya koyun.


7







N ├žift ├žoraplar─▒n─▒z─▒ s─▒ralama problemi O (n) 'd─▒r . Onlar─▒ ├žama┼č─▒r sepetine atmadan ├Ânce , solunu sa─ča do─čru ge├žirin . Bunlar─▒ ├ž─▒kar─▒rken ipli─či kesip her ├žifti ├žekmecenize yerle┼čtirin - n ├žiftlerinde 2 i┼člem, yani O (n).

┼×imdi bir sonraki soru basit├že kendi ├žama┼č─▒r─▒n─▒z─▒ y─▒kay─▒p y─▒kamayaca─č─▒n─▒z ve e┼činizin de oldu─ču. Bu tamamen farkl─▒ bir problem alan─▒nda muhtemel bir problemdir . :)


7



─░lgili yay─▒nlar


Taahh├╝tler bir daldan di─čerine nas─▒l kopyalan─▒r?

Ge├žmi┼či koruyarak dosyalar bir git repo'dan di─čerine (klon de─čil) nas─▒l ta┼č─▒n─▒r

Ana pencerede iframe ba─člant─▒s─▒ a├ž─▒lmaya zorlan─▒r

Go kullanarak dosya nas─▒l okunur / yaz─▒l─▒r?

Dosyalar─▒ 'varl─▒klar' klas├Âr├╝nden sdcard'a nas─▒l kopyalar─▒m?

Veriler uzundan geni┼č bi├žime nas─▒l yeniden ┼čekillendirilir

Maven ba┼čka bir dizinden nas─▒l ├žal─▒┼čt─▒r─▒l─▒r (cd olmadan project dir)?

Veri kaybetmeden PostgreSQL'i 9.6 s├╝r├╝m├╝nden 10.1 s├╝r├╝m├╝ne nas─▒l y├╝kseltebilirim?

String'den char'e java dilinde nas─▒l d├Ân├╝┼čt├╝r├╝l├╝r?

Bir bildirim t─▒klatmas─▒ndan bir etkinli─če parametreler nas─▒l g├Ânderilir?

Etiketle ilgili di─čer sorular [algorithm]


JQuery'de bir onay kutusunun i┼čaretli olup olmad─▒─č─▒ nas─▒l kontrol edilir?

Bir dizinin t├╝m dosyalar─▒n─▒ nas─▒l listeleyebilirim?

LinkedList Java'da ArrayList ├╝zerinden ne zaman kullan─▒l─▒r?

Bir fonksiyonda global de─či┼čkenleri kullanma

ÔÇťGit add -AÔÇŁ ve ÔÇťgit addÔÇŁ aras─▒ndaki fark.

A├ž─▒k anahtar kelime ne anlama geliyor?

Kiraz toplama Git ile bir taahh├╝t nedir?

JavaBean tam olarak nedir?

D─▒┼ča aktar─▒lan bir ortam de─či┼čkenini nas─▒l silerim?

G├╝ncelleme ve silme i├žin HTTP durum kodu?