Saya harap saya dapat berkontribusi sesuatu yang baru untuk masalah ini. Saya perhatikan bahwa semua jawaban mengabaikan fakta bahwa ada dua poin di mana Anda dapat melakukan preprocessing , tanpa memperlambat kinerja cucian Anda secara keseluruhan.
Juga, kita tidak perlu mengasumsikan sejumlah besar kaus kaki, bahkan untuk keluarga besar. Kaus kaki dikeluarkan dari laci dan dipakai, dan kemudian dilempar ke suatu tempat (mungkin tempat sampah) tempat mereka tinggal sebelum dicuci. Sementara saya tidak akan menyebut kata bin LIFO-Stack, saya akan mengatakan aman untuk menganggap itu
- orang-orang melemparkan kedua kaus kaki mereka secara kasar di area yang sama dari tempat sampah,
- tempat sampah tidak diacak kapan saja, dan karenanya
- setiap himpunan bagian yang diambil dari bagian atas nampan ini umumnya berisi kedua kaus kaki sepasang.
Karena semua mesin cuci yang saya tahu memiliki ukuran terbatas (terlepas dari berapa banyak kaus kaki yang harus Anda cuci), dan pengacakan yang sebenarnya terjadi di mesin cuci, tidak peduli berapa banyak kaus kaki yang kita miliki, kami selalu memiliki subset kecil yang mengandung hampir tidak ada lajang.
Dua tahap preprocessing kami adalah "meletakkan kaus kaki di tali jemuran" dan "Mengambil kaus kaki dari tali jemuran", yang harus kami lakukan, untuk mendapatkan kaus kaki yang tidak hanya bersih tetapi juga kering. Seperti halnya mesin cuci, jemuran terbatas, dan saya berasumsi bahwa kita memiliki seluruh bagian dari garis tempat kita menaruh kaus kaki kita.
Berikut algoritma untuk put_socks_on_line ():
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
}
}
Jangan buang waktu Anda untuk memindahkan kaus kaki atau mencari pasangan yang cocok, ini semua harus dilakukan di O (n), yang juga akan kita perlukan untuk menempatkannya di telepon tanpa disortir. Kaus kaki belum dipasangkan, kami hanya memiliki beberapa cluster kesamaan di telepon. Sangat membantu bahwa kita memiliki satu set kaus kaki terbatas di sini, karena ini membantu kita untuk membuat kelompok "baik" (misalnya, jika hanya ada kaus kaki hitam di set kaus kaki, pengelompokan dengan warna tidak akan menjadi cara untuk pergi)
Berikut algoritma untuk take_socks_from_line ():
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
}
Saya harus menunjukkan bahwa untuk meningkatkan kecepatan langkah-langkah yang tersisa, adalah bijaksana untuk tidak secara acak memilih kaus kaki berikutnya, tetapi secara berurutan mengambil kaus kaki setelah kaus kaki dari masing-masing kelompok. Kedua langkah preprocessing tidak memakan waktu lebih dari sekadar meletakkan kaus kaki di garis atau di keranjang, yang harus kita lakukan tidak peduli apa, jadi ini harus sangat meningkatkan kinerja binatu.
Setelah ini, mudah untuk melakukan algoritma partisi hash. Biasanya, sekitar 75% dari kaus kaki sudah dipasangkan, meninggalkan saya dengan subset kaus kaki yang sangat kecil, dan subset ini sudah (agak) terkelompok (saya tidak memasukkan banyak entropi ke keranjang saya setelah langkah preprocessing). Hal lain adalah bahwa cluster yang tersisa cenderung cukup kecil untuk ditangani sekaligus, sehingga dimungkinkan untuk mengeluarkan seluruh cluster dari keranjang.
Berikut algoritma untuk sort_remaining_clusters ():
while(clusters present in basket) {
Take out the cluster and spread it
Process it immediately
Leave remaining socks where they are
}
Setelah itu, hanya ada beberapa kaus kaki yang tersisa. Di sinilah saya memperkenalkan kaus kaki yang sebelumnya tidak berpasangan ke dalam sistem dan memproses kaus kaki yang tersisa tanpa algoritma khusus - kaus kaki yang tersisa sangat sedikit dan dapat diproses secara visual dengan sangat cepat.
Untuk semua kaus kaki yang tersisa, saya berasumsi bahwa rekan-rekan mereka masih belum dicuci dan menyimpannya untuk iterasi berikutnya. Jika Anda mendaftarkan pertumbuhan kaus kaki tidak berpasangan dari waktu ke waktu ("kebocoran kaus kaki"), Anda harus memeriksa nampan Anda - mungkin akan diacak (apakah Anda memiliki kucing yang tidur di sana?)
Saya tahu bahwa algoritma ini mengambil banyak asumsi: tempat sampah yang bertindak sebagai semacam tumpukan LIFO, mesin cuci normal, terbatas, dan tali jemuran normal terbatas - tetapi ini masih berfungsi dengan jumlah kaus kaki yang sangat besar.
Tentang paralelisme: Selama Anda melemparkan kedua kaus kaki ke tempat sampah yang sama, Anda dapat dengan mudah memparalelkan semua langkah itu.