我希望我可以为这个问题做出新的贡献。我注意到所有答案都忽略了一个事实,您可以在两个方面执行预处理,而不会降低整体洗衣性能。
另外,即使对于大家庭,我们也无需假设大量的袜子。将袜子从抽屉中取出并穿上,然后将它们扔在要清洗的地方(可能是垃圾箱)。虽然我不会称“ bin”为“ 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堆栈的垃圾桶,一台有限的普通洗衣机和一排有限的普通晾衣绳-但这仍然适用于大量的袜子。
关于并行性:只要将两只袜子扔到同一个料箱中,就可以轻松地并行化所有这些步骤。