昨天我从干净的洗衣店里给袜子配对,发现我做这件事的方式不是很有效。我一直在天真地搜寻-挑选一只袜子,然后“反复”寻找那双袜子。这需要遍历的n / 2 * N / 4 = N 2平均/ 8的袜子。
作为计算机科学家,我在想我能做什么?当然会想到进行排序(根据大小/颜色/ …)以实现O(NlogN)解决方案。
不能选择散列或其他非现场解决方案,因为我无法复制袜子(尽管如果可以的话,可能会很好)。
因此,问题基本上是:
给定一堆n成对的袜子,其中包含2n元素(假设每只袜子都有一对完全匹配的袜子),最好的方法是用对数的额外空间有效地将它们配对在一起?(我相信我可以记住该信息的数量,如果需要的话。)
n
2n
我希望能从以下几个方面回答这个问题:
已经提出了排序解决方案,但是 排序有点过多 :我们不需要订单; 我们只需要平等团体 。
因此 散列 就足够了(并且更快)。
这种递归哈希分区实际上是由SQL Server在需要对大型数据集进行哈希联接或哈希聚合时完成的。它将其构建输入流分配到许多独立的分区中。该方案可线性扩展到任意数量的数据和多个CPU。
如果您可以找到一个 提供足够存储桶 的分发密钥(哈希密钥),而每个存储桶足够小,可以非常快速地进行处理,则不需要递归分区。不幸的是,我认为袜子没有这种特性。
如果每个袜子都有一个称为“ PairID”的整数,则可以根据PairID % 10(最后一位)轻松地将它们分配到10个存储桶中。
PairID % 10
我能想到的最好的现实分区是创建一个 矩形的桩 :一个维是颜色,另一个维是图案。为什么是矩形?因为我们需要O(1)对堆的随机访问。(3D 长方体也可以,但这不是很实际。)
更新:
那么 并行性 呢?可以让多个人更快地匹配袜子吗?
怎么样的元素明显的问题?如文章所述,可以在中解决元素差异性问题O(N)。袜子问题也是O(N)如此(同样,如果只需要一个分配步骤(我提议多个步骤只是因为人类在计算上很差- 如果分配在一个步骤上就足够了md5(color, length, pattern, ...),即所有属性的 完美哈希 ))。
O(N)
md5(color, length, pattern, ...)
显然,没有人能比O(N)这快,所以我们已经达到了 最佳下限 。
尽管输出并不完全相同(在一种情况下,只是布尔值。在另一种情况下,是成对的袜子),则渐进复杂度是相同的。