我希望我可以为这个问题贡献一些新的东西。我注意到所有答案都忽略了这样一个事实,即您可以在两点上执行预处理,而不会降低整体洗衣性能。
此外,我们不需要假设大量的袜子,即使对于大家庭也是如此。袜子从抽屉里拿出来穿上,然后扔到一个地方(可能是一个垃圾箱),然后再洗。虽然我不会将所说的 bin 称为 LIFO-Stack,但我会说可以安全地假设
- 人们将两只袜子大致扔在垃圾箱的同一区域,
- bin 在任何时候都不是随机的,因此
- 从这个箱子顶部取出的任何子集通常都包含一对袜子。
由于我所知道的所有洗衣机的尺寸都是有限的(不管你要洗多少只袜子),而实际的随机化发生在洗衣机中,无论我们有多少袜子,我们总是有小的子集,其中几乎没有单身人士。
我们的两个预处理阶段是“把袜子放在晾衣绳上”和“从晾衣绳上拿袜子”,为了得到不仅干净而且干燥的袜子,我们必须这样做。与洗衣机一样,晾衣绳是有限的,我假设我们将袜子放在视线范围内的整个部分。
这是 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 堆栈的垃圾箱、一个有限的普通洗衣机和一个有限的普通晾衣绳——但这仍然适用于大量袜子。
关于并行性:只要你把两只袜子都扔进同一个箱子里,你就可以轻松地并行化所有这些步骤。