我希望我能对这个问题做出一些新的贡献。我注意到所有答案都忽略了一个事实,即有两个可以进行预处理的点,而不会降低您整体洗涤效率。
此外,即使对于大家庭,我们也不需要假设有大量的袜子。袜子被拿出抽屉穿着,然后扔到一个地方(可能是一个箱子)等待洗涤。虽然我不会称之为LIFO-堆栈,但我可以说可以安全地假设:
- 人们将两只袜子粗略地扔在箱子的同一区域,
- 箱子在任何时候都不会随机排列,因此
- 从该箱子顶部取出的任何子集通常都包含一对袜子。
由于我所知道的所有洗衣机都有尺寸限制(无论要洗多少只袜子),而实际的随机过程发生在洗衣机中,因此,无论我们有多少只袜子,我们总会有包含几乎没有单一项的小子集。
我们的两个预处理阶段是“把袜子挂在晾衣绳上”和“从晾衣绳上取下袜子”,为了得到既干净又干燥的袜子,我们必须这样做。与洗衣机一样,晾衣绳也是有限的,我假设我们可以看到放袜子的整个部分。
以下是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
}
}
不要浪费时间来移动袜子或寻找最佳搭配,这一切都应该在O(n)的时间内完成,这也适用于未排序的放置。
这些袜子尚未成对,我们只有线上的几个相似聚类。很幸运的是,我们这里只有有限的袜子集,这有助于我们创建“好”的聚类(例如,如果袜子集中只有黑色袜子,则按颜色聚类不是正确的方法)
以下是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
}
我需要指出的是,为了提高剩余步骤的速度,明智的做法不是随意选择下一只袜子,而是依次从每个簇中取出袜子。这两个预处理步骤所需的时间不比将袜子放在线上或篮子里更长,而我们无论如何都必须这样做,因此这应该大大提高洗衣效率。
之后,执行哈希分区算法就很容易了。通常,约有75%的袜子已经成对,留下的袜子非常少,而且这个子集已经(有点)聚类(在预处理步骤后,我在篮子里没有引入太多熵)。另外一件事是,剩余的簇往往足够小,可以一次性处理完,因此可以将整个簇从篮子中取出。
以下是sort_remaining_clusters()算法:
while(clusters present in basket) {
Take out the cluster and spread it
Process it immediately
Leave remaining socks where they are
}
然后,只剩下几只袜子了。这时我会将之前未成对的袜子引入系统,处理剩余的袜子时不需要任何特殊算法 - 剩余的袜子很少,可以通过视觉快速处理。
对于所有剩余的袜子,我假设它们的配对袜仍未清洗干净,并将它们放在一旁等待下一轮迭代。如果你发现未成对袜子数量逐渐增加("袜子泄漏"),你应该检查你的垃圾桶 - 它可能已经被打乱了(你有没有睡在那里的猫?)
我知道这些算法基于许多假设:一个像LIFO堆栈的垃圾桶,一个有限的普通洗衣机和普通的晾衣绳 - 但即使在大量的袜子情况下,这个方法仍然有效。
关于并行性:
只要把两只袜子扔进同一个垃圾桶里,你就可以轻松地并行化所有这些步骤。
waitpid
函数,这样作为父进程,你甚至不需要亲自整理任何袜子? - Mxyk