Soru Çorapları verimli bir şekilde nasıl birleştirirsiniz?


Dün çorapları temiz çamaşırlardan eşleştiriyordum ve yaptığım şekilde anladım çok verimli değil. Saf bir arama yapıyordum - bir çorabın toplanması ve çiftini bulmak için yığının "tekrarlanması". Bu, n / 2 * n / 4 = n üzerinde yineleme gerektirir2Ortalama / 8 çorap.

Bir bilgisayar bilimcisi olarak ne yapabilirim diye düşünüyordum? Sıralama (boyut / renk /… göre) elbette bir O (NlogN) çözümü elde etmek için akla geldi.

Karma ya da diğer yerinde olmayan çözümler bir seçenek değildir, çünkü çoraplarımı kopyalayamıyorum (eğer olabilseydim hoş olabilir).

Yani, soru temelde:

Bir yığın göz önüne alındığında n içeren çift çorap 2n elemanlar (her bir çorapın bir eşleşme çiftine sahip olduğunu varsayalım), bunları logaritmik fazladan boşlukla verimli bir şekilde eşleştirmenin en iyi yolu nedir? (Gerekirse bu miktarda bilgi hatırlayabileceğime inanıyorum.)

Aşağıdaki yönleri ele alan bir cevabı takdir edeceğim:

  • Genel teorik Çok sayıda çorap için çözüm.
  • Gerçek çorap sayısı o kadar büyük değil, eşime inanmam ve 30'dan fazla çift var. (Ve çoraplarımı ve onun arasındakileri ayırt etmek oldukça kolay; bu da kullanılabilir mi?)
  • Eşdeğer mi eleman ayrımı problemi?

3507
2018-01-19 15:34


Menşei


Tam olarak çamaşır yığından birini eşleştirmek için güvercin deliği prensibini kullanıyorum. 3 farklı renkte çorap (Kırmızı, Mavi ve Yeşil) ve her bir rengin 2 çifti var. Her seferinde 4 tane çorap alırım ve her zaman bir çift oluşturur ve işe geçerim. - Srinivas
Yine başka bir güvercin deliği prensibi: Eğer n / 2 + 1 çorap bir alt kümesini alırsanız, orada olmalıdır Bu alt kümedeki en az bir çift. - wildplasser
Harika soru! Makalemde ilgili bir problemle ilgilenebilirsiniz, ki bu da iki eşleşmiş çorapın kazıktan çekilme olasılığının bir tartışmasıdır: blogs.msdn.com/b/ericlippert/archive/2010/03/22/... - Eric Lippert
Neden bir çocuk doğurmaz ve waitpid Ebeveyn olarak hiç çorap giymedin mi? - Mxyk
Bu sorunu sadece beyaz diz-yüksek çoraplara sahip olarak çözdüm. Hepsi eşleşiyor. Sadece iki çorapı kazıktan rastgele alabiliyordum ve eşleşiyorlardı. Ben daha fazla sorunu çorap eşleştirme NOT ile basitleştirin. Çoraplarımın hepsini ... ... eşleştirmediğim bir çorap çekmecem var. Her sabah çekmeceden iki tanesini rastgele alıyorum. Onu (0) 'a kadar basitleştirdim. Bundan daha kolay olamaz. :) - Lee


Cevaplar:


Sıralama çözümleri önerildi, ancak sıralama biraz fazla: Siparişe ihtiyacımız yok; sadece eşitlik gruplarına ihtiyacımız var.

Yani karma yeterli (ve daha hızlı) olurdu.

  1. Çorapların her rengi için kazık oluşturmak. Giriş sepetinizdeki tüm çorapların üzerinde yineleyin ve bunları renk yığınlarına dağıtın.
  2. Her kazık üzerinde yineleyin ve başka bir metrikle dağıt (ör. desen) ikinci yığın kümesine
  3. Bu şemayı yinelemeli olarak uygulayın üzerine tüm çorapları dağıtana kadar Hemen görsel olarak işleyebileceğiniz çok küçük kazık

Bu tür özyinelemeli karma bölümleme aslında tarafından yapılmakta SQL Server büyük veri kümeleri üzerinde karma birleştirmeye veya karma toplamaya ihtiyaç duyduğunda. Yapı giriş akışını bağımsız olan birçok bölüme dağıtır. Bu şema, rastgele veri miktarlarına ve çoklu CPU'lara doğrusal olarak ölçeklendirir.

Bir dağıtım anahtarı (karma anahtar) bulabilirseniz, yinelemeli bölümlemeye ihtiyacınız yoktur. Yeterli kovalar sağlar Her bir kova çok hızlı bir şekilde işlenecek kadar küçüktür. Ne yazık ki, çorapların böyle bir mülk sahibi olduğunu sanmıyorum.

Her çorap "PairID" denilen bir tamsayıya sahipse, bunlara göre 10 kovaya kolayca dağıtabilir PairID % 10 (son rakam).

Düşünebildiğim en iyi gerçek dünya bölümleme bir kazık dikeni: Bir boyut renk, diğeri desen. Neden bir dikdörtgen? Çünkü yığınlara O (1) rastgele erişime ihtiyacımız var. (Bir 3D küboid ayrıca çalışırdı, ama bu çok pratik değil.


Güncelleştirme:

Ne dersin paralellik? Birden çok insan çorapları daha hızlı eşleştirebilir mi?

  1. En basit paralelleştirme stratejisi, çok sayıda işçinin giriş sepetinden alması ve çorapları yığınlara yerleştirmesidir. Bu sadece çok fazla ölçekleniyor - 10 yığın üzerinde 100 insanın çarpıştığını hayal edin. Senkronizasyon maliyetleri (kendilerini el çarpışmaları ve insan iletişimi olarak tezahür ettirerek) verimliliği ve hızlandırmayı yok et (bkz. Evrensel Ölçeklenebilirlik Yasası!). Bu eğilimli mi kilitlenmeler? Hayır, çünkü her çalışanın bir seferde yalnızca bir yığına erişmesi gerekiyor. Sadece bir "kilit" ile bir kilitlenme olamaz. Livelocks İnsanların yığınlara erişimi nasıl koordine ettiğine bağlı olarak mümkün olabilir. Sadece kullanabilirler rastgele geri çekilme Ağ kartları gibi, hangi kartın yalnızca özel ağ kablosuna erişebileceğini belirlemek için bunu fiziksel düzeyde yapın. Eğer çalışırsa NICinsanlar için de çalışmalı.
  2. Eğer neredeyse sınırsızca ölçeklenirse her işçi kendi yığın kümesine sahip. İşçiler daha sonra giriş sepetinden büyük çorap parçaları alabilirler (nadiren yaptıkları için çok az çekişme) ve çorapları dağıtırken senkronizasyona gerek duymazlar (çünkü iplik-yerel yığınları vardır). Sonunda, tüm işçilerin yığın kümelerini birleştirmeleri gerekiyor. Eğer işçiler bir işçinin oluşturması durumunda O'nun (günlük işçi sayısı * işçi sayısı) yapılabileceğine inanıyorum. toplama ağacı.

Ne hakkında eleman ayrımı problemi? Makale belirttiği gibi, eleman farklılığı problemi çözülebilir. O(N). Bu çorap sorunu için de aynı O(N)Eğer sadece bir dağıtım adımına ihtiyacınız varsa (sadece hesaplamalarda insanlar kötü olduğu için birden fazla adım önerdim) eğer dağıtıyorsanız bir adım yeterlidir md5(color, length, pattern, ...)yani mükemmel karma tüm özelliklerin)).

Açıkçası, kimse daha hızlı olamaz O(N), o yüzden optimal alt sınır.

Çıkışlar tam olarak aynı olmamasına rağmen (bir durumda, sadece bir boole. Diğer durumda, çorap çiftleri), asimptotik karmaşıklıklar aynıdır.


2180
2017-10-19 20:47



Bu benim yaptığım şey! Çorapların açılmasına bağlı olarak kazık yaptım (sadece beyazım var), bu da her birinin hemen eşleşmesi için yeterli "kova" veriyor. - Scott Chamberlain
Bunu çoraplarım ile denedim (kolayca 30'dan fazla çift var) ve bu adam HIZLI. Bulduğum bir sorun, yeterince iyi bir karma algoritma elde edemediğim (herhangi bir desen içermeyen çok sayıda beyaz çorapım var) bu yüzden zorlaşıyor. Bu durumda, bunu yapmanın en iyi yolu ne olurdu? - NothingsImpossible
@NothingsImpossible bu karma çarpışma saldırıları fakir bir web sunucusu için nasıl hissettiriyor! Beyaz çorap bazı özelliklerle ayırt edilebilir mi? Onları dağıtabileceğiniz bir şey olmalı. Aksi takdirde, sadece çiftleri rasgele oluşturabilirsin. - usr
Bu doğru cevap olduğunu kabul ettiğim bir Radix Sort. @MarkPeters Bir arama tablosuna ihtiyacınız olduğunu düşünmüyorum. Çorapların üzerine tek bir doğrusal geçiş, çorapları sayı vektörlerine dönüştürebilir ve bu da "çorap segmenti" nin kepçe önemsizliğine eşleştirilmesini sağlar. Çoraplar, vektörleri dizgilerle bağlayabilir, böylece sonunda başka bir doğrusal geçişe ihtiyacınız olmaz. - Pointy
Üniversiteye gittiğim bir adam aslında DoubleID'leri vardı. Her bir çift çorap üzerine dikildi: 1, 2, 3, 4 ... - Ryan Lundy


İnsan beyninin mimarisi modern bir işlemciden tamamen farklı olduğu için, bu soru pratik bir anlam ifade etmemektedir.

İnsanlar, "eşleşen bir çift bulma" nın çok büyük olmayan bir set için tek bir işlem olabileceği 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 onu çok verimli buluyorum. Dezavantajı düz bir yüzey gerektirir, ancak genellikle bol miktarda bulunur.


523
2018-05-27 19:13



çorapların sayısı arttıkça, insanın SIMD'si bir CPU'dan daha iyi olmaz. - Lie Ryan
En iyi cevap, IMO. Eğlenceli ve akıllı (ve SO için uygun) bir günlük bir problemi bilgisayar algoritmasına indirgemekle birlikte, ~ 60 çorap kadar küçük bir set için insan gözünün / beyninin çözünürlük gücünü kullanmak daha mantıklıdır. - drug_user841417
@LieRyan Çoraplar düzgün bir şekilde dağıtılırsa, doğum günü paradoksundan dolayı yeterince küçük bir çorap setinde bir çift fark edeceksiniz (eğer şüphelendiğim renklere ayırım yapamazsanız), buradaki darboğaz burada olmaz insan renk eşleştirme algoritması ama yayılma adımı. - Thomas
@ dpc.ucore.info Hayır, çünkü farklı dokunmuş manşet modelleri, manşet uzunlukları, genel uzunlukları ve siyah tonları var (eşim muhtemelen sonuncusu için fiziksel olarak zarar görür). - Christian
Umarım daha fazla çorapınız olur, aksi takdirde çorapları uzun süre katlarsınız ... - Patrick James McDougle


Dava 1: Bütün çoraplar aynıdır (bu arada gerçek hayatta yaptığım şey budur).

Bir çift yapmak için bunlardan herhangi birini seçin. Sürekli zaman.

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

kullanım taban sıralaması. Karşılaştırma gerekli olmadığından, bu sadece doğrusal bir zamandır.

Durumda 3: Kombinasyonların sayısı önceden bilinmemektedir (genel durum).

İki çorapın çift olarak gelip gelmediğini kontrol etmek için karşılaştırmamız gerekiyor. Birini seçin O(n log n) karşılaştırma tabanlı sıralama algoritmaları.

Ancak gerçek hayatta, çorap sayısı nispeten küçük (sabit) olduğunda, bu teorik olarak optimal algoritmalar iyi çalışmaz. Teorik olarak ikinci dereceden zaman gerektiren sıralı aramadan daha fazla zaman alabilir.


231



> Teoride ikinci dereceden zaman gerektiren sıralı aramadan daha fazla zaman alabilir. Evet bu yüzden bunu yapmaktan nefret ediyorum, belki tüm çoraplarımı fırlatmalı ve 1. vaka ile başlamalıyım. - Nils
Aynı çorapların hepsine de sahip olmayı daha kolay buluyorum. Her çift yılda, satışa çıktıklarında 6 paket çoraptan 10 tane aldım ve eski çoraplarımı dışarı atıyorum. Aynı çorapları eşleştirmek için daha kolay ve eski kutsal çoraplardan daha iyi görünüyorlar. Bununla, sadece kazıkların en üstündeki basit bir ilk, benim için en hızlı olanıdır. - Michael D. Kirkpatrick
tüm benzer çoraplara sahip olmanın aşağı tarafı, farklı oranlarda yaşlanma eğilimindedir. Yani hala onların ne kadar yıprandığına göre onları eşleştirmeye çalışıyorsun. (sadece desenle eşleşmekten daha zor olan) - SDC
"Eşleşmeyi daha kolay hale getirdiği için" aynı çift çoraplı 60 çiftin olması problemi, insanlara bilgisayarlarla çalıştığınız izlenimi veriyor olmasıdır. - Steve Ives
Dava 1Katlama çiftleri gibi bir işlemin söz konusu olduğu zamanlar sabit değildir. Bu durumda, en küçük sabit faktörle doğrusallık süresi (bunun kanıtı okuyucu için bir egzersiz olarak bırakılır). Bir muhtemelen bir çift ve bir kova çorap dolu katlanırken aynı anda alamaz. Ancak, doğrusal olarak ölçeklendirir. Amdahl yasası gereği, ek yükü görmezden gelerek sınırsız hızlandırma var. Gustafson yasası gereği, yeterli sayıda işçiyi (okuyucu için bir egzersiz olarak bırakılan miktar) verilen bir çifti katlamak için gereken kadar çift katlayabilir, yükü görmezden gelebilirsiniz. - acelent


Algılamayan yanıt, henüz "verimli" yaptığımda:

  • adım 1) mevcut tüm çoraplarınızı atın

  • adım 2) git Walmart ve bunları 10 - n paket paketleriyle satın alın siyah beyaz ve m paketleri. Her gün diğer renkler için gerek yok hayat.

Yine de zaman zaman bunu tekrar yapmak zorundayım (çorapları yitirmiş, çorapları yıpranmış, vb.) Ve çok iyi çorapları çok sık atmaktan nefret ediyorum (ve aynı çorap referansını satmayı diledim!), Bu yüzden son zamanlarda Farklı bir yaklaşım.

Algoritmik cevap:

Yaptığınız gibi, çorapların ikinci yığını için sadece bir çorap çizdiğinizden daha iyi düşünün, naif bir aramada eşleşen çorap bulma ihtimaliniz oldukça düşüktür.

  • Bu yüzden beşini rastgele al ve şekillerini veya uzunluklarını ezberle.

Neden beş? Genellikle insanlar iyi işleyen hafızada beş ve yedi farklı eleman arasında hatırlamakta iyidir - insan dengi gibi RPN yığın - beş güvenli bir varsayılan değerdir.

  • 2n-5 yığından bir tane al.

  • Şimdi bir eşleşme (görsel desen eşleştirmesi - insanlar küçük bir yığınla iyi bir şey) ararsanız, beş tane çizdiğinizde, bir tane bulamazsanız, bunu beşinize ekleyin.

  • Yığında rastgele çorap toplamaya devam edin ve bir maç için 5 + 1 çorapınızla karşılaştırın. Yığın büyüdükçe, performansınızı azaltacak, ancak oranlarınızı artıracaktır. Çok daha hızlı.

Bir eşleşmenin% 50'lik bir oranı için kaç örnek çizmeniz gerektiğini hesaplamak için formülü yazabilirsiniz. IIRC bu bir hipergeometrik yasadır.

Bunu her sabah yapıyorum ve nadiren üçten fazla çekmeye ihtiyacım var - ama benim n benzer çiftler (yaklaşık 10, kayıp olanlara ver veya al) m beyaz çorap şeklinde. Şimdi stok yığınımın boyutunu tahmin edebilirsin :-)

BTWBen, bir çora ihtiyaç duyduğum her seferinde tüm çorapları sıralamanın işlem maliyetlerinin toplamının, bir kez yapmaktan ve çorapları bağlamaktan çok daha az olduğunu buldum. Tam zamanında çalışır çünkü o zaman çorapları bağlamak zorunda kalmazsınız ve ayrıca azalan bir marjinal getiri vardır (yani, çamaşırlarda bir yerlerde ve ihtiyaç duyduğunuzda iki veya üç çorap aramaya devam edersiniz) çoraplarınızı bitirmeyi bitirmek için zaman kaybedersiniz.


144



'Algoritmik olmayan' cevabı almaktan çekinmeyin. Bu tam olarak yaptığım şey ve harika çalışıyor. Yıkanmış çorapları arkaya yerleştirerek ve çekmecenin önünden çekerek çorap stoğunuzu 'döndürdüğünüzde, yeni bir sorun değil. Bütün çoraplar eşit şekilde kullanılır. Bir parça giymeye başladığımda, tüm çorap sınıfını tamamen değiştirmek için alışveriş listesini koydum. Eski çoraplar için, Şerefiye'ye en iyi% 20'yi veriyorum (bir bakkalda bağlanmışlar, böylece geri karışmazlar) ve geri kalanlara zıplar. Çorapları boşa harcamıyorsunuz, bu noktada,% 80'inde sadece 6 ay kaldı. - FastAl
BTW (1) Çoraplarınızın bağlanması elastik olanın gergin bir şekilde saklanmasını sağlar ve çok daha çabuk başarısız olur. Bağlanmamış benzersiz çorap çeşitlerini sınırlandırın. (2) Benzersiz çorapların sınırlandırılmasının bir dezavantajı, belirli moda kaygıları olan insanlar için yöntemin uygun olmaması olabilir. - FastAl
Özellikle "algoritmik olmayan" cevabınızı göndermek için buraya geldim. Gerçek bilgisayar bilimlerinde olduğu gibi, çoğu insan veriye ve yapısına yeterince ilgi göstermez. - bkconrad
Bu algoritmik yaklaşımı her sabah kullanırım ve çekicilik gibi çalışır! Buna ek olarak, daha sonra atmak için çorapları yıpranmış bir çorapla koydum (maalesef, çöpe atma zamanını bulmadan önce orijinal yığına ulaşmayı başarabilirler). - Donatas Olsevičius
«Beyaz ve m siyah paketlerden oluşan paket. Günlük yaşamda diğer renkler için gerek yok »Kolay çorap seçimi için iyi bir standart kural, aslında pantolonunuzun rengine veya kemerinizin rengine uymaları gerektiğidir. Bu nedenle, en yaygın kullanılan renkler muhtemelen siyah, mavi, gri ve biraz kahverengi olacaktır. Birisinin çok beyaz çoraplara ihtiyacı olduğuna inanmak zor. - Andrea Lazzarotto


Yaptığım şey, ilk çorapları alıp yıkayım (çamaşır kasesinin kenarında). Sonra başka bir çorap alırım ve ilk çorapla aynı olup olmadığını kontrol ederim. Öyleyse, ikisini de kaldırırım. Eğer değilse, ilk çorapın yanına koydum. Sonra üçüncü çorapları alıp ilk ikiyle karşılaştırıyorum (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ı çıkarmanıza bile gerek yok. Çorapları ayırmaya ihtiyacınız yoksa (aşağıya bakınız), o zaman sadece onları hareket ettirebilir ve dizideki çiftler halinde düzenlenmiş tüm çorapları içeren bir diziyle bitirebilirsiniz.

Çorapların tek işleminin eşitlik için karşılaştırmak olduğunu varsayarsak, bu algoritma temel olarak hala bir n'dir.2 Algoritma, ortalama durum hakkında bilmeme rağmen (bunu hesaplamayı asla öğrenmemiştim).

Sıralama, tabii ki, diğer iki çorap arasında bir çorap kolayca "sokabilirsiniz" gerçek hayatta, verimliliği artırır. Bilgisayarda aynı bir ağaç elde edilebilir, ancak bu ekstra alan. Ve elbette, NlogN'a geri döndük (ya da aynı çiftten değil, sıralama ölçütleriyle aynı olan birkaç çorap varsa).

Bunun dışında bir şey düşünemiyorum, ama bu yöntem gerçek hayatta oldukça verimli görünüyor. :)


92



Bu da benim yaptığım şeydir (sadece boşluk bırakıyorsanız ekler de O (1)), fakat teorik olarak çok sayıda çorapla zayıf bir şekilde ölçeklendirilir. - Mooing Duck
teorik olarak büyük sayılarla zayıf ölçeklendirir türleri çorap - Steven Lu
@StevenLu - dediğim gibi - onu sıralamanıza veya açmanıza bağlı olarak, n * n veya nLogn. Yani herhangi bir sıralama algoritması kadar zayıf bir şekilde ölçeklendirir. Daha hızlı istiyorsanız, onları numaralandırın ve yarıçap sıralama kullanın. - Vilx-
Bu, esasen, karma-bazlı bir aramada bulunan, ancak eşleşmeyen çorapları depolamaktır. İdeal bir karmaşa ile O (n) 'dir, fakat eğer hashın dejenere olmaya başladığı kadar yeterli çorap varsa, buna göre daha karmaşık hale gelir. - Jon Hanna
Diğer iki çorap arasına bir çorap sokmak hangi değeri çorap eşleştirmeyi hedefliyor? çorapların bir önemi yok. : -x - JoeBrockhaus


Bu yanlış soruyu soruyor. Sormak için doğru soru, neden zaman ayırma çorapları harcıyorum? Serbest zamanınıza, seçtiğiniz X para birimleri için değer verdiğinizde, yıllık bazda ne kadara mal olur?

Ve daha sık değil, bu sadece herhangi boş zaman sabah Yatakta harcayabileceğiniz veya kahvenizi yudumlayabileceğiniz veya biraz erken bırakıp trafiğe yakalanmadığınız boş zaman.

Bir adım geri atmak ve problemin bir yolunu düşünmek genellikle iyidir.

Ve bir yolu var!

Beğendiğin bir çorap bul. İlgili tüm özellikleri dikkate alın: farklı aydınlatma koşullarında renk, genel kalite ve dayanıklılık, farklı iklim koşullarında konfor ve koku emilimi. Önemli olan depolamada elastikiyeti kaybetmemeleri, böylece doğal kumaşların iyi olması ve plastik bir ambalajda bulunması gerekir.

Sol ve sağ ayak çorapları arasında fark olmasa daha iyidir, ancak bu kritik değildir. Eğer çoraplar sağda simetrik ise, bir çiftin O (1) çalışması olduğunu ve çorapların yaklaşık O (M) çalışması olduğunu, M'nin evinizde, çoraplarla dolu olan yerlerin sayısı olduğunu, ideal olarak küçük sabit sayı.

Farklı sol ve sağ çoraplarla süslü bir çift seçtiyseniz, sol ve sağ ayak kovalarına tam kova sıralama yapmak, (N + M), N'nin çorap sayısı ve M yukarıdaki ile aynıdır. Başka bir kişi, ilk çifti bulmak için ortalama yineleme formülü verebilir, ancak kör arama ile bir çift bulmak için en kötü durum, N / 2 + 1'dir, bu da makul N için astronomik bir olasılık haline gelir. Bu, gelişmiş görüntü kullanılarak hızlandırılabilir Sıralanmamış çorapların yığınlarını tararken algılama algoritmaları ve sezgisel tarama Mk1 Gözküresi.

Yani, O (1) çorap eşleştirme verimliliğini elde etmek için bir algoritma (simetrik çorap varsayarak):

  1. Hayatınızın geri kalanı için kaç tane çora ihtiyacınız olacağını ya da belki de çorapları tekrar giymeye gerek kalmadan ısınan iklimlere geçene kadar tahmin etmelisiniz. Eğer gençseniz, hepimizin evimizde çorap-soyma robotları bulundurmadan önce ne kadar süreceğini tahmin edebilirsiniz ve tüm sorun ilgisiz hale gelir.

  2. Seçtiğiniz çorapları toplu olarak nasıl sipariş edebileceğinizi ve ne kadar maliyete mal olacağını ve bunların nasıl teslim edildiğini öğrenmeniz gerekiyor.

  3. Çorapları sipariş et!

  4. Eski çoraplarından kurtul.

Alternatif bir adım 3, aynı miktardaki belki de daha ucuz çorapların birkaç yıl içinde satın alınmasının maliyetlerini karşılaştırmakla birlikte, çorapları ayırma maliyetini de ekleyecektir, ancak bunun için sözümü alın: toplu alım yapmak daha ucuzdur! Ayrıca, depodaki çoraplar, hisse senedi fiyat enflasyonunun değerine bağlı olarak artar, ki bu da birçok yatırımdan daha fazladır. Daha sonra yine depolama maliyeti de var, ancak çorap gerçekten bir dolabın üst rafında fazla yer kaplamıyor.

Sorun çözüldü. Öyleyse, yeni çoraplar alın, eskilerini atın / bağışlayın ve hayatınızın geri kalanında her gün para ve zaman tasarrufu yaptığınızı bilerek mutlu bir şekilde yaşayın.


50



Bir ömür boyu (75 yıllık varsayım) çorap tedariki (4 çift / ay egzoz yaptığınız varsayılırsa, 3600 çift yapar) (yeni bir çift çorapın 20 kübik inç aldığını varsayarsak) toplam 1 1/2 kübik metre alır. Bu muazzam bir alan. Kabaca bir küp içinde size teslim ettikleri varsayılırsa, bu sandık bir tarafta yaklaşık 3 feet 4 inç olacaktır. - AJMansfield
@AJMansfield geçerli bir endişe. Bununla birlikte, birkaç numaraya katılmıyorum. Sadece 40 yıl (25 ... 65) bir zaman dilimi alırdım (ebeveynler / yurt / yaşama ve emekli olmama arasındaki zaman, yukarı bakınız). Ayrıca, bir çiftin orijinal ambalajında ​​0,5x4x6 inç daha fazla aldığını düşünüyorum. Bu sayılar uzay tahmininizi biraz aşağıya çeker! - hyde
4. adım gereksiz yere gereksizdir, -1. - Dan Bechard
AJMansfield'in ölçümleriyle karıştırılan başkaları için kılavuz, metrik olarak bir çeviri: »yeni bir çift çorabın varsayımı (toplam 327 cm³ olduğu varsayılır) toplam 1.14 m³. Bu muazzam bir alan. Kabaca bir küp olarak size teslim ettikleri varsayılırsa, bu sandık bir tarafta yaklaşık 1.04 m olacaktır. « - Joey


Teorik sınır O (n) 'dir, çünkü her çorapa dokunmanız gerekir (bazıları bir şekilde eşleştirilmiş değilse).

İle O (n) elde edebilirsiniz taban sıralaması. Sadece kovalar için bazı nitelikler seçmeniz gerekiyor.

  1. Önce sen seçebilirsin (benim, benim) - onları 2 kazıklara böl,
  2. daha sonra renkleri kullanın (renkler için herhangi bir sıraya sahip olabilir, ör., renk adına göre alfabetik olarak) - bunları kazıklara göre renklendirin (aynı yığının içindeki tüm çoraplar için 1. aşamadan başlangıç ​​sırasını saklamayı unutmayın),
  3. o zaman çorapın uzunluğu,
  4. sonra doku, ....

Sınırlı sayıda öznitelik seçebilirseniz, ancak her çifti benzersiz bir şekilde tanımlayabilecek yeterli öznitelikler varsa, O (k * n) içinde yapılmalıdır;


47



Çoraplar genellikle 4 paketli ve daha büyüktür, çünkü daha ucuzdur, ancak bu da onları ayırt edilemez kılar. Buna karşı karım satın aldığım her yeni çorabın üzerine minik bir işaret diker. İşaret, renklerin tükendiği takdirde, her bir çift için veya farklı bir şekilden farklı bir renktedir. Bu yaklaşımla sınırlı sayıda özniteliğe bile ihtiyacınız yoktur. Sadece her çiftin üzerinde benzersiz bir numara dikin. :) Ekstra puan için ikili kullanın. - Vilx-
@ Vilx- NEDEN?!? Tüm nokta ayırt edilemez değil mi? - flup
@flup - Bence bütün nokta daha büyük paketlerde satmaktır. :) Bana gelince, bu çiftler halinde onları aşağı giymeye yardımcı olur. Aksi halde üç çok yıpranmış çorap ve bir yepyeni ile sonuçlanabilir. Biraz aptalca. - Vilx-
O (n) hesaplamasına katılmıyorum. $ K $ nedir? $ k $ özniteliklerin sayısıdır. Ben $ k $ $ O (log n) $ olduğunu iddia ediyorum çünkü her çifti benzersiz bir şekilde tanımlamak için yeterli olması gerekiyor. 2 çiftiniz (siyah beyaz) varsa, renk ($ k = 1, n = 2 $) yeterlidir. Bir çift siyahınız varsa kısa; bir çift siyah, uzun; bir çift beyaz, kısa; ve bir çift beyaz, uzun - sonra $ k = 2, n = 4 $. Daha sonra $ k $ ile sınırlanırsak, aynı zamanda $ n $ ile sınırlanırız. Eğer $ n $ ile sınırlanacaksak, sipariş hesaplaması artık mantıklı değil. - emory
@emory, bence backtick'i arıyorsun, $ Karakter, eşyalarınızı kod-y görünmesi için. - Xymostech


Pratik bir çözüm olarak:

  1. Kolayca kolayca ayırt edilebilen çorap yığınları yapın. (Renge göre söyle)
  2. Quicksort her kazık ve karşılaştırma için çorapın uzunluğunu kullanın. Bir insan olarak, en kötü durumdan sakınmak için kullanmak için çorap kullanmak için oldukça hızlı bir karar verebilirsiniz. (Paralel olarak birden fazla çorap görebilirsiniz, bunu kendi yararınıza kullanın!)
  3. Spot çiftleri ve eşi benzeri olmayan çorapları anında bulmak için rahat olduğunuz bir eşiğe ulaştığında kazıkları durdurmayı bırakın

Eğer 8 renk ve ortalama dağılımı olan 1000 çorapınız varsa, her 125 çorapdan 4'ü c * n zamanda yapabilirsiniz. 5 çorabın eşiği ile her tüyü 6 turda sıralayabilirsiniz. (Sağ kazık üzerine bir çorap atmak için 2 saniye saymak sizi 4 saatin altında tutacak.)

Sadece 60 çorap, 3 renk ve 2 çeşit çorap (eşiniz / karınız) varsa, 10 çorabın her grubunu 1 seferde sıralayabilirsiniz (Tekrar eşik = 5). (2 saniye saymak sizi 2 dakika sürecektir).

İlk kova sıralama işleminizi hızlandıracaktır, çünkü n çoraplarınızı k kovalarına ayırır. c*n zaman sadece sen yapmak zorunda kalacaksın c*n*log(k) iş. (Eşiği hesaba katmamak). Sonuçta tüm yaptığınız n*c*(1 + log(k)) iş, c nerede bir yığın üzerinde bir çorap atmak için zamanı.

Bu yaklaşım herhangi biriyle kıyaslandığında olumlu olacaktır. c*x*n + O(1) yöntem kabaca uzun olduğu gibi log(k) < x - 1.


Bilgisayar bilimlerinde bu yararlı olabilir: N bir koleksiyonumuz var eşyalarOnlarda bir düzen (uzunluk) ve aynı zamanda bir eşdeğerlik ilişkisi (örneğin çorapların rengi gibi ekstra bilgiler). Eşdeğerlik ilişkisi, orijinal koleksiyonun bir bölümünü oluşturmamıza izin verir ve her denklik sınıfında bizim düzenimiz hala korunur. Bir haritalama şey Eşdeğerlik sınıfına O (1) 'de yapılabilir, böylece her maddeyi bir sınıfa atamak için sadece O (n) gereklidir. Şimdi ek bilgilerimizi kullandık ve her sınıfı sıralamak için herhangi bir şekilde ilerleyebiliriz. Avantajı, veri kümelerinin zaten çok daha küçük olmasıdır.

Yöntem, birden fazla eşdeğerlik ilişkimiz varsa -> renk yığınlarını, dokudaki her yığın bölmesinden uzunluğa göre sıralamaktan daha çok iç içe olabilir. Eşit boyutta 2'den fazla eleman içeren bir bölüm oluşturan herhangi bir eşdeğerlik ilişkisi, sıralama üzerine bir hız artışı getirecektir (doğrudan yığına bir çorap atabilirsek) ve sıralama daha küçük veri kümelerinde çok hızlı bir şekilde gerçekleşebilir.


31



İnsan optimizasyonu: Bir insan olarak, adım 2 için, çorapları kabaca yükselen düzende aşağı doğru sürmelisiniz, sonra sıralamaya göre biraz daha ince ve daha ince tanecikli, tekrar tekrar kabuk sıralaması yapmalısınız. Bu, bir insan için (görsel tahmin) karşılaştırma-takas tabanlı bir yaklaşımdan çok daha hızlı olacaktır. - AndrewC


Bu soru aslında çok felsefi. Kalbinde, insanların problemleri çözme gücünün (beyinlerimizin "ıslak zemini") algoritmalarla neyin başarılabileceğine eşdeğer olup olmadığıdır.

Çorap sıralama için belirgin 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 problemdeki bilgisayar bilimi tüm adımlarla ilgili.

  1. "eğer N bir çorapla çiftlerse". Şimdiye kadar gördüklerimizi ne kadar çabuk "hatırlıyoruz"?
  2. "N'den t'yi kaldır" ve "N'ye ekle". Şimdiye kadar gördüğümüz şeyin kaydını tutmak ne kadar pahallı?

İnsanoğlu, bunları etkilemek için çeşitli stratejiler kullanacaktır. İnsan hafızası olduğu ilişkiselsaklı değerlerin özellik kümelerinin karşılık gelen değerlerle eşleştirildiği bir karma tablo gibi bir şey. Örneğin, "kırmızı araba" kavramı, bir kişinin hatırlayabildiği tüm kırmızı arabalarla eşleşir. Mükemmel bir belleğe sahip biri mükemmel bir haritaya sahiptir. Çoğu insan bu konuda kusurludur (ve çoğu diğerleri). İlişkilendirilmiş harita sınırlı bir kapasiteye sahiptir. Mappings olabilir bip çeşitli koşullar altında (bir bira çok fazla) mevcudiyetin dışında, yanlışlıkla kaydedildi ("Ben onun adı Betty, Nettie değil" idi) veya gerçeğin değiştiğini gözlemlememize rağmen asla yazılmayacak ("babanın arabası" çağrıştırıyor) "Turuncu Firebird" dediğimizde bunu kırmızı Camaro için sattığını biliyorduk.

Çorap durumunda, mükemmel bir geri çekilme bir çorap bakmak demektir s her zaman kardeşinin anısını üretir tbulmak için yeterli bilgi (ütü masasında nerede) t sabit zamanda. Fotoğrafik hafızaya sahip bir kişi, sürekli olarak 1 ve 2'yi başarısız olmadan gerçekleştirir.

Mükemmel bellekten daha az olan biri, izleyebilme özelliği içindeki özelliklere dayanan birkaç sağduyu denklik sınıfını kullanabilir: boyut (papa, anne, bebek), renk (yeşilimsi, kirmizi, vb.), Desen (argyle, düz, vb.) , stil (footie, diz-yüksek, vb.). Bu nedenle ütü masası, kategoriler için bölümlere ayrılacaktır. Bu genellikle, kategorinin bellek tarafından sabit zamanda konumlandırılmasına izin verir, ancak daha sonra "kova" kategorisinde doğrusal bir aramaya ihtiyaç duyulur.

Hiç bellek ya da hayal gücü olmayan biri (üzgünüm), sadece çorapları bir yığın halinde tutacak ve bütün yığının doğrusal bir araştırmasını yapacaktır.

Düzgün bir ucube, önerildiği gibi çiftler için sayısal etiketler kullanabilir. Bu, insanın tam olarak bir CPU ile gerçekleştirebileceğimiz aynı algoritmaları kullanmasına izin veren toplam bir siparişin kapısını açar: ikili arama, ağaçlar, karmaşalar, vb.

Bu nedenle, "en iyi" algoritma, onu çalıştıran ıslak yazılım / donanım / yazılımın niteliklerine ve çiftler üzerinde toplam sipariş vererek "aldatma" konusundaki istekliliğimize bağlıdır. Kesinlikle "en iyi" meta-algorithm, dünyadaki en iyi çorap-ayırıcıyı kiralamaktır: sabit zaman aralığına, eklemeye ve silmeye yarayan 1-1 bağlantı hafızasında büyük bir set N of çorap özniteliği atarak hızlıca depolayabilen ve hızlı bir şekilde depolayabilen bir kişi veya makine. Hem insanlar hem de bunun gibi makineler tedarik edilebilir. Eğer bir tane varsa, tüm çorapları N (çift) için O (N) saatinde eşleştirebilirsiniz, bu da en uygun olanıdır. Toplam sipariş etiketleri, aynı sonucu bir insan veya donanım bilgisayarıyla almak için standart karmalamayı kullanmanızı sağlar.


25



Tamam, bu daha iyi, hala oldukça yanlış olmasına rağmen ... bu soru bununla ilgili değil. Church-Turing tezi doğru olsun ya da olmasın, hem insanlar hem de bilgisayarlarımız çorapları sıralayabilir. (Gerçek şu ki, insanlar, sonlu sonlu varlıklar olmaları, Turing Makinalarından çok daha az hesaplama gücüne sahipler ... ve aynısı bilgisayarlarımız için de geçerlidir, ancak sınırlamalar farklıdır.) - Jim Balter
Katılmıyorum. Tabii ki mevcut bilgisayarlarımızdan herhangi biri bir TM'den ziyade esasen ve muazzam DFA'dır (modulo i / o farklılıkları). Bununla birlikte, herhangi bir analog cihaz, vücudumuz gibi, sonsuz bir bant taklit edebilir. Zihinlerimizin hesaplama biçiminin henüz yararlı bir karakterizasyonuna sahip değiliz. - Gene
İnsanlarda veya diğer fiziksel cihazlarda sonsuz bant yoktur, çünkü insan beynindeki hiçbir şey sonsuz çözünürlüğe sahip değildir, ne de olabilir. Bazı nörobilim öğrenmeye de yardımcı olur. Her halükarda, birini enjekte etme isteğiniz ne olursa olsun, burada derin bir felsefi soru yoktu. Ama neye inandığına inanıyorum ... bu tür tartışmalar için yer değil ve daha önce çok fazla zaman geçirdim. Ama ben her zaman TM-eşdeğeri olduklarını hayal eden en basit sorunları (hepimiz bu) çözebilen insanlar tarafından eğlendim. - Jim Balter


Yanlış sorunu çözmeye çalışıyorsunuz.

Çözüm 1: Kirli çorapları her zaman çamaşır sepetinize koyduğunuzda, küçük bir düğüm halinde bağlayın. Bu sayede yıkamadan sonra herhangi bir sıralama yapmak zorunda kalmayacaksınız. Mongo veritabanında bir indeksi kaydetmek gibi düşünün. Gelecekte bazı CPU tasarrufları için biraz çalışma var.

Çözüm 2: Kış ise, uygun çorap giymek zorunda değilsin. Biz programcıyız. Çalıştığı sürece kimsenin bilmesi gerekmiyor.

Çözüm 3: İşi yay. UI'yi engellemeden, karmaşık olmayan bir CPU işlemini asenkron olarak gerçekleştirmek istiyorsunuz. O çorap yığınını al ve bir torbaya doldur. İhtiyacınız olduğunda sadece bir çifti arayın. Bu şekilde alması gereken iş miktarı çok daha az fark edilir.

Bu yardımcı olur umarım!


24



Bir düğümündeki çorapların (veya herhangi bir giysinin) bağlanması, yıkayıcının çamaşırları yıkamasını ve daha fazla aşınmasını engellemeyi azaltır. Çözüm 2, işlerin durumu ilerledikçe bakımın daha da zorlaşmasını sağlar; 6 ay sonra, bir çift şort ve spor ayakkabısıyla giymek için iki siyah ayak bileği çorapına ihtiyaç duyduğunuzda, 6 ay boyunca her türlü işi yapmak aynı durumda (kirli / temiz, benzer aşınma) bu çifti bulmayı daha az olası hale getirecektir. Çözüm 3 daha az "asenkron" ve daha düz "tembel" dir; İhtiyacınız olduğunda tam olarak ihtiyacınız olan minimum işi yapın. - KeithS