Umarım bu soruna yeni bir şey katabilirim. Tüm cevapların önişleme yapabileceğiniz iki nokta olduğunu ihmal ettiğini fark ettim. , genel çamaşır performansınızı yavaşlatmadan .
Ayrıca, büyük aileler için bile çok sayıda çorap almamız gerekmiyor. Çoraplar çekmeceden çıkarılır ve giyilir ve daha sonra yıkanmadan önce kaldıkları bir yere (belki bir çöp kutusu) atılırlar. Demek bin'e LIFO-Stack demezken, bunu kabul etmenin güvenli olduğunu söyleyebilirim.
- insanlar her iki çorapını da kabın aynı bölgesine fırlatırlar,
- çöp kutusu herhangi bir noktada rastgele değildir ve bu nedenle
- bu kutunun tepesinden alınan herhangi bir alt küme genellikle bir çiftin her iki çorapını da içerir.
Bildiğim tüm çamaşır makinelerinin boyutu sınırlı olduğu için (kaç tane çorap yıkamanız gerektiğine bakılmaksızın) ve çamaşır makinesinde gerçek randomizasyon meydana geldiğinden, kaç tane çorapımız olursa olsun, her zaman neredeyse hiç içermeyen küçük alt setlerimiz vardır. singletonların.
İki ön işleme aşamamız, sadece temiz değil aynı zamanda kuru çoraplar elde etmek için "çorapları çamaşır ipine takmak" ve "çorapları çamaşır ipinden almak" tır. Çamaşır makinelerinde olduğu gibi, çamaşır ipleri sonludur ve sanırım çoraplarımızın görünür olduğu hattın tüm kısmına sahibiz.
İş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ı dolaşırken veya en iyi eşleşmeyi aramak için zamanınızı boşa harcamayın, tüm bunlar O (n) 'da yapılmalıdır, bu da onları sadece sıralanmamış çizgiye koymak için ihtiyacımız olacak. Çoraplar henüz eşleşmedi, hatta sadece birkaç benzerlik kümemiz var. Burada "iyi" kümeler oluşturmamıza yardımcı olduğu için sınırlı bir çorap setimiz olması yararlıdır (örneğin, çorap setinde sadece siyah çoraplar varsa, renklere göre kümelenme yolu olmaz)
Take_socks_from_line () için algoritma şöyledir:
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ı artırmak için, bir sonraki çorabı rastgele seçmemek, ancak her kümeden çoraptan sonra sırayla çorap almak akıllıca olacaktır. Her iki önişleme adımı, çorapları hatta veya sepete koymaktan daha fazla zaman almaz, bu da ne olursa olsun yapmamız gerekir, bu nedenle çamaşır performansını büyük ölçüde arttırmalıdır.
Bundan sonra, karma bölümleme algoritmasını yapmak kolaydır. Genellikle, çorapların yaklaşık% 75'i zaten eşleştirilmiş ve beni çok küçük bir çorap alt kümesiyle bırakıyor ve bu alt küme zaten (biraz) kümelenmiş (ön işleme adımlarından sonra sepetime fazla entropi eklemiyorum). Başka bir şey, geri kalan kümelerin aynı anda ele alınacak kadar küçük olma eğilimindedir, bu nedenle tüm kümeyi sepetten çıkarmak mümkündür.
İşte 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ı. Bu, 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ı işlenebilir.
Kalan tüm çoraplar için, meslektaşlarının hala yıkanmamış olduğunu ve bir sonraki yineleme için onları bıraktığını varsayıyorum. Zamanla eşleştirilmemiş çorapların büyümesini kaydederseniz (bir "çorap sızıntısı"), çöp kutunuzu kontrol etmelisiniz - rastgele olabilir (orada uyuyan kediniz var mı?)
Bu algoritmaların çok fazla varsayım aldığını 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 - ancak bu hala çok sayıda çorapla çalışıyor.
Paralellik hakkında: Her iki çorabı aynı ambalaja attığınız sürece, tüm bu adımları kolayca paralelleştirebilirsiniz.