如何从一堆有效一双袜子?(How to pair socks from a pile efficie

2019-07-18 10:48发布

昨天我从清洁洗衣配对的袜子和想通了,我是这样做的方式是不是很有效。 我在做一个天真的搜索 - 选择一个袜子,以便找到其对“迭代”桩。 这需要迭代在n / 2 * N / 4 = N 2/8上平均的袜子。

作为一名计算机科学家,我想我可以做什么? 排序(按大小/颜色/ ......)当然来考虑,以实现O(NlogN)的解决方案。

散列或其他不到位的解决方案是不是一种选择,因为我不能够复制我的袜子(尽管它可能如果我能很好)。

所以,这个问题基本上是:

鉴于一堆n袜子对,包含2n元素(假设每个袜子都有一个确切的匹配对),什么是与有效配对起来长达数额外空间的最佳方式? (我相信我能记住的信息的量如果需要的话。)

我会明白,解决了以下几个方面的答案:

  • 袜子的数量庞大的一般理论解。
  • 袜子的实际数量是没有那么大,我不相信我的配偶和我有30多对。 (它是很容易我的袜子和她之间的区别,可以这样用呢?)
  • 它是相当于元素清晰度问题 ?

Answer 1:

排序解决方案已被提出,但排序是有点太多了 :我们不需要顺序; 我们只需要平等的群体

因此, 散列就足够了,速度更快。

  1. 对于袜子的每种颜色, 形成一个堆 。 遍历所有的袜子在你的输入笼和他们分配到的颜色桩
  2. 遍历每个桩通过一些其它度量 (例如图案) 分发到第二组桩
  3. 递归应用该方案直到你已经发布的所有袜子到非常小的桩,你可以立即进行视觉处理

这种递归散列分区的实际上是由于完成的SQL Server时,它需要哈希连接或哈希聚集了庞大的数据集。 它分配其生成输入流成是独立的多个分区。 该方案扩展到数据和多个CPU线性的任意金额。

你不需要递归分区,如果你能发现, 提供足够的桶 ,每个桶是足够小,可以非常快速地处理分配密钥(哈希键)。 不幸的是,我不认为袜子有这样的属性。

如果每个袜子有所谓的“PairID”整人可以轻松地将它们根据分配到10桶PairID % 10年(最后一位)。

最佳的真实世界的划分,我能想到的是创建桩的矩形 :一个维是颜色,另一种是模式。 为什么一个矩形? 因为我们需要O(1)随机访问桩。 (一个3D 立方体也将工作,但不是很实用。)


更新:

什么并行 ? 多个人类可以搭配袜子更快?

  1. 最简单的并行策略是有多个工人从输入笼取放袜子到桩。 这只会大大加快了这么多 - 想象100人的战斗超过10桩。 同步费用 (表现自己作为手工碰撞和人际交往) 破坏效率和加速 (见的通用可扩展性法 !)。 这是容易出现死锁 ? 不能,因为每个工人只需要在同一时间访问一个桩。 只用一个“锁定”不能有死锁。 这取决于人类如何协调访问桩活锁是可能的。 他们可能只使用了随机退避像网卡做,在物理层上,以确定哪些卡可以完全访问网络丝。 如果一切正常的网卡 ,它应该对人类正常工作。
  2. 它扩展了近无限期的,如果每个工人都有自己的一套桩 。 那么工人可以采取袜子大块从输入笼(非常小的竞争,因为它们很少这样做),并在所有分配的袜子时,他们并不需要同步(因为他们有线程局部桩)。 最后,所有的工人需要工会的桩套。 我认为,可以在O完成(日志(工人数*桩每个工人))如果工人形成的聚合树

怎么样的元素明显的问题 ? 作为文章的状态,该元件清晰度问题可被解决O(N) 这是袜子的问题(也同O(N)如果你只需要一个分配步骤(我建议不仅是因为人类不擅长计算多个步骤-一个步骤是不够的,如果你发布的md5(color, length, pattern, ...)即所有属性的完美hash))。

显然,一个不能去的速度比O(N)所以我们已经达到了最佳的下限

虽然输出是不完全一样的(在一种情况下,仅仅一个布尔值。在其他情况下,袜子的对),渐近复杂性是相同的。



Answer 2:

由于人类大脑的结构是比现代的CPU完全不同的,这个问题是没有实际意义。

人类可以利用的事实,“找到一个匹配对”战胜CPU算法可以是一组不太大的操作。

我的算法:

spread_all_socks_on_flat_surface();
while (socks_left_on_a_surface()) {
     // Thanks to human visual SIMD, this is one, quick operation.
     pair = notice_any_matching_pair();
     remove_socks_pair_from_surface(pair);
}

至少,这是我使用在现实生活中是什么,我觉得很有效。 缺点是它需要一个平坦的表面,但它通常是丰富的。



Answer 3:

案例1:所有的袜子是相同的(这是我的方式在现实生活中做的)。

选择其中任意两个配成一对儿。 恒定时间。

情况2:有组合(所有权,颜色,大小,纹理等)的常数。

使用基数排序 。 这是由于不需要比较仅线性时间。

情况3:组合的数量不是预先(通常情况下)已知的。

我们必须做对比,以检查是否进来对两只袜子。 挑之一O(n log n)基于比较的排序算法。

然而在现实生活中,当袜子的数量相对较少(恒定),这些理论上的最优算法将无法正常工作。 这可能需要比顺序查找,理论上需要二次的时间,甚至更长的时间。



Answer 4:

非算法答案,但“高效”,当我做到这一点:

  • 步骤1)放弃所有现有的袜子

  • 步骤2)去沃尔玛和10的报文购买他们-黑白色和m个包的的N个分组。 在日常的生活中不再需要其他颜色。

然而,次次,我不得不再次做到这一点(丢失的袜子,袜子损坏等),我恨放弃完美的袜子过于频繁(我真希望他们一直卖同样的袜子参考!),所以我最近花不同的方法。

算法的答案:

考虑比如果你只画出一个袜子袜子的第二栈,你在干什么,你在一个天真的搜索找到匹配的袜子的可能性是相当低的。

  • 于是拿起其中五随意,记录它们的形状或它们的长度。

为什么5? 通常人类善于在工作记忆五个到七个不同元素之间的记忆-有点像一个相当于人类RPN堆栈-五是安全默认值。

  • 拾取一个从2n 5的叠层。

  • 现在寻找匹配(视觉模式匹配 - 人类是在与一小摞好),你画了,五个里面,如果你没有找到一个,然后添加到您的五个。

  • 请从堆栈中随机挑选袜子和比较,以你5个+ 1袜子匹配。 当你的栈的增长,它会降低你的性能,但提高你的胜算。 快多了。

随意写下公式来计算你有多少样本,以绘制匹配50个%的胜算。 IIRC它是一个超几何定律。

我这样做,每天早上,很少需要超过三平局-但我n类似的对(约10,或采取丢失的)的m状的白袜子。 现在,您可以估计我的股票堆栈的大小:-)

顺便说一句 ,我发现,每次我需要一个对时间排序的所有袜子的交易成本之和远远小于做一次和有约束力的袜子。 一个刚刚在时间效果更好,因为你不必绑定的袜子,也有一个递减的边际回报率(即,你不停地寻找,当某处洗衣和你需要的是两个或三个袜子完成匹配你的袜子,你失去的时间上)。



Answer 5:

我要做的就是,我拿起第一袜子爱不释手(比如,在洗衣盆的边缘)。 然后,我拿起另一袜子和检查,看它是否是一样的第一袜子。 如果是,我删除他们两个。 如果不是的话,我把它放下旁边的第一个袜子。 然后我拿起第三袜子和比较,前两个(如果他们仍然存在)。 等等。

这种方法可以很容易地在阵列中实现的,假定“移除”袜子是一个选项。 事实上,你甚至都不需要“删除”袜子。 如果你不需要的袜子排序(见下文),那么你可以移动它们周围,并使用具有排列在阵列中对所有的袜子数组结束。

假设袜子唯一的操作是比较平等,这种算法基本上还是正2算法,虽然我不知道的情况下,平均做(没学过来计算)。

排序当然,提高效率,特别是在现实生活中,你可以很容易地“插入”其他两只袜子之间的袜子。 在计算同样可以由一棵树来实现,但这是额外的空间。 而且,当然,我们回到NlogN(或者多一点,如果有几个袜子是由分类标准是相同的,而不是从同一对)。

除此之外,我想不出任何东西,但这种方法似乎是在现实生活中相当有效。 :)



Answer 6:

这是问错了问题。 正确的问题要问的是,为什么我花时间整理袜子? 要花多少钱每年成本,当你珍惜你对你所选择的X货币单位的空闲时间?

而更多的,往往不是,这不是任何空闲时间,这是上午的自由时间,这你可以在床上花费,或喝你的咖啡,或早退了一下,在交通不被抓住。

这往往好退一步,并认为解决该问题的方法。

还有一个办法!

找到你喜欢的袜子。 采取所有相关的特征考虑在内:在不同的光照条件下,在不同气候条件下的整体质量和耐用性,舒适性,以及吸附异味的颜色。 同样重要的是,他们不应该在储存失去弹性,所以天然面料都不错,他们应该在一个塑料包装是可用的。

这是更好,如果有左,右脚的袜子没有区别,但它并不重要。 如果袜子是左右对称的,找到一个对是O(1)操作,并整理袜子是近似的O(M)操作,其中M是在你的房子的地方,你有袜子散落的数量,最好是一些小的常数。

如果你选择了一个奇特的对不同的左边和右边的袜子,做了充分的桶排序,以左右脚桶取O(N + M),其中N是袜子的数量,M是与上述相同。 别人可以得到式用于查找第一对平均迭代,但用于查找与盲搜索一对最坏的情况下为N / 2 + 1,这成为不可能天文情况下合理N.这可以通过使用先进的图像被加速识别算法和试探法,扫描与未分选的袜子的桩时的Mk1眼球 。

所以,为了实现O(1)袜子配对效率(假设对称袜子)的算法是:

  1. 你需要估计你有多少双袜子的需要为您的余生,或者直到你退休,并移动到温暖的气候,无需以后再穿上袜子。 如果你还年轻,你也可以估算需要多长时间之前,我们都必须袜子分拣机器人在我们的家园,整个问题变得无关紧要。

  2. 你需要找到如何才能订购散装您选择的袜子,多少它的成本,做他们提供。

  3. 订购袜子!

  4. 摆脱你的旧袜子。

另一种第3步将涉及比较在一段时间多年来购买也许更便宜的袜子相同数量的几双,加入整理袜子的成本费用,而且把我的话:买散装的便宜! 此外,在股票价格的通货膨胀,这是多,你会得到很多投资的速度值存储增长的袜子。 再然后还有存储成本,但是袜子真的不采取衣柜的顶部架子上的空间。

问题解决了。 所以,仅仅得到新袜子,抛出/捐出你的旧的走,知道你每天都节省了金钱和时间,为您的生活后剩下的生活幸福快乐的日子。



Answer 7:

该理论极限为O(n),因为你需要触摸每个袜子(除非一些已经以某种方式配对)。

可以实现与O(n)的基数排序 。 你只需要挑选桶的某些属性。

  1. 首先,你可以选择(她的,我的) - 把它们分成2堆,
  2. 然后用颜色(可以有颜色的任何命令,如按字母顺序颜色名称) - 其拆分成桩的颜色(记得从第1步保持初始为了使所有的袜子在同一个桩),
  3. 然后袜子的长度,
  4. 然后质感,....

如果你可以选择属性的数量有限,但足以属性,可以唯一地识别每个对,你应该在O(K * N),这是O(n),如果我们可以考虑k是有限的完成。



Answer 8:

作为一个实际的解决方案:

  1. 迅速使容易区分堆堆袜。 (通过颜色说)
  2. 快速排序每桩用袜子的长度进行比较。 作为一个人,你可以做一个相当快的决定,这袜子用来分区避免了最坏的情况。 (你可以看到多个袜子并行,用它来你的优势!)
  3. 停止当他们到达时,你是舒适的发现点对和unpairable袜子瞬间阈值排序堆

如果你有1000成的袜子,有8种颜色,平均分配,你可以在C * n次4桩每125个袜子。 随着5个袜子的阈值,你可以在排序6次每桩。 (计数2秒扔在一堆权袜子它会带你一点不到4个小时。)

如果你只有60袜子3种颜色和2排序袜子(你/你妻子的),你可以在排序运行1 10个袜子每堆(同样阈值= 5)。 (2计数单位为秒,将带你2分钟)。

最初的桶排序,会加速你的进程,因为这将您ň袜子到在K桶c*n时间,让比你只需要做c*n*log(k)工作。 (不考虑阈值)。 所以,这一切的一切,你做一下n*c*(1 + log(k))工作,其中c是扔在一堆袜子的时间。

相比于任何这种方法将是有利的c*x*n + O(1)方法大致只要log(k) < x - 1


在计算机科学这可能是有益的:我们有n个东西 ,一个订单他们集合(长度),也等价关系(额外的信息,袜子例如颜色)。 等价关系使我们能够对原始集合的分区,并在每一个等价类我们的订单依然维持。 的东西把它映射的等价类可以在O(1),所以只为O(n)是需要每个项目指定给一个类来完成。 现在,我们已经使用了我们额外的信息,可以任何方式进行在每类排序。 其优点是数据集已显著较小。

该方法也可以嵌套,如果我们有多个等价关系 - >使色彩桩,不是每一个纹理一堆分区中,除分类的长度。 创建与具有约什尺寸会带来的速度提升了排序超过2元一个分区的任何等价关系(前提是我们可以直接给袜子其桩),并且排序可以在较小的数据集发生得很快。



Answer 9:

这个问题其实是深深的哲理。 在心脏它是关于人的力量是否解决问题(在我们的大脑的“湿件”)相当于什么可以通过算法来完成。

对于袜子分拣一个明显的算法是:

Let N be the set of socks that are still unpaired, initially empty
for each sock s taken from the dryer
  if s matches a sock t in N
    remove t from N, bundle s and t together, and throw them in the basket
  else
    add s to N

现在,计算机科学,这个问题是所有的步骤

  1. “如果与在N,N-袜子吨小号对”。 如何能迅速,我们“记住”什么我们迄今为止见过?
  2. “选自N除去t”和“添加s到N”。 如何昂贵的是跟踪的东西我们迄今为止见过?

人类会使用各种策略来实现这些。 人类的记忆联想 ,像其中存储的值的功能集与相应的值本身配对的哈希表。 例如,“红车”映射到所有的红色轿车的概念,一个人能够记住的。 有人用完美的记忆有一个完美的映射。 大多数人在这方面(和其他大多数)不完善。 缔地图具有有限的容量。 映射可以哔哔了在各种情况下存在(一个啤酒太多)的,被记录在错误(“我虽然她的名字是贝蒂,不内蒂”),或者即使我们观察到的事实已经改变(“爸爸从来没有被覆盖当我们真正知道他交易,在对红色的Camaro)汽车”唤起‘橙色火鸟’。

在袜子的情况下,完美召回装置看袜子s总是产生其兄弟的存储器t ,包括足够的信息(它是在熨衣板)来定位t在恒定的时间。 一个人与照相存储器在一定的时间来完成这两个图1和2没有失败。

有人用不到完美的记忆可以使用基于特征的几个常识性的等价类自己的能力范围内追踪:尺寸(爸爸,妈妈,宝宝),颜色(绿色,瑞迪施等),模式(亚皆老街,平原等) ,风格(趣味足球,膝盖高,等等)。 所以,熨衣板将被划分为类别部分。 这通常允许在恒定的时间由存储器位于类别,但则需要通过类别“桶”线性搜索。

与所有的(对不起)没有记忆或想象有人会只保留袜子一大堆,做一大堆的线性搜索。

有人建议洁癖可能使用数字标签对。 这将打开大门,进行整体排序,这使得人类的使用正是我们可能与CPU相同的算法:二进制搜索,树,哈希等

所以,“最好”的算法依赖于运行它,我们愿意通过对征收全序“欺骗”湿件/硬件/软件的质量。 当然,“最佳” -algorithm是聘请世界上最好的袜子分拣机:可AQUIRE和快速存储庞大的集袜子属性集N的恒定时间的查找,插入一个1-1联想记忆的人或机器,和删除。 人和机器这样可以采购。 如果你有一个,你可以配对所有的袜子在O(N)时为N对,这是最佳的。 订单总标签允许您使用标准的哈希与任何人或计算机硬件,以获得相同的结果。



Answer 10:

您正在试图解决错误的问题。

解决方案1:你每次把脏袜子在你的洗衣篮的时候,他们绑在一个小的结。 这样,你不会有洗涤后做任何的排序。 你可以把它像一个蒙戈数据库登记的索引。 提前为未来的某个CPU节省一点点的工作。

解决方案2:如果是冬天,你没有穿袜子要。 我们是程序员。 没有人需要知道,只要它的作品。

解决方案3:传播工作。 要异步执行这样一个复杂的CPU进程,而不会阻塞UI。 就拿那一堆袜子和他们的东西,在一个袋子。 只有寻找一对,当你需要它。 这样的工作量需要的是明显要少得多。

希望这可以帮助!



Answer 11:

费用:移动袜子 - >在高线,发现/搜索袜子 - >小

我们想要做的是减少移动次数,并与搜索的次数进行补偿。 另外,我们可以利用智人的multithreded环境中descision缓存来保存更多的事情。

X =你的,Y =你的配偶

从所有的袜子一堆:

挑选两只袜子,放在X线对应的X袜子,并在下一可用位置Y袜子在Y线。

做,直到A是空的。

对于每个线X和Y

  1. 挑头的袜子线,沿线搜索,直到找到相应的袜子。

  2. 放进袜子相应的成品线。

  3. 可选当您正在搜索的行,和你正在寻找在当前袜子等同于以前的,做第2步这些袜子。

可选步骤之一,从该行,而不是两个挑了两个袜子,因为缓存内存足够大,如果任袜子匹配你所观察的线当前,我们可以快速识别。 如果你足够幸运,有三个武器,你可能在考虑到对象的内存足够大,同时解析3个袜子。

做,直到X和Y是空的。

完成

然而,因为这有呈三角复杂性,选择排序,所用的时间远小于由于I / O(运动袜)和搜索(搜索袜子线路)的速度。



Answer 12:

下面是一个欧米茄(N log n)的下界基于比较模型。 (唯一有效的操作是比较两个袜子。)

假设你知道你的袜子2N安排是这样的:

P 1 P 2 P 3 ... P N P F(1)p F(2)。。。P F(N)

其中f是该组的一个未知的置换{1,2,...,N}。 知道了这一点不能使问题更难。 有n! 可能的输出(第一和第二半之间的匹配问题),这意味着你需要的log(n)!=欧米茄(N log n)的比较。 这是通过排序来获得。

既然你有兴趣到元素清晰度问题连接:证明欧米茄(N log n)的开往元素分辩率更难,因为输出是二进制的是/否。 这里,输出必须是匹配的,并可能输出的数量足以得到一个体面的束缚。 然而,有连接到元素明显的变体。 假设你给出2n个袜子,不知道是否他们都可以被唯一配对。 你可以通过发送从ED的减少(A 1,A 2,...,A n)与(A 1,A 1,A 2,A 2,...,A N,A N)。 (顺便,ED的硬度证明是非常有趣的, 通过拓扑结构 。)

我认为,应该有一个欧米茄(N 2)开往原来的问题,如果你只允许相等测试。 我的直觉是:考虑一个图表,你的测试之后添加边缘,并认为,如果图形不密实的输出不是唯一确定的。



Answer 13:

这是我如何真正做到这一点,对袜子的(N = 2P个人袜子):

  • 抓住从一堆随机袜子。
  • 对于第一袜子,或者如果所有以前选择的袜子已经配对,简单地将袜子成在你面前未配对的袜子“阵列”的第一个“时隙”。
  • 如果你有一个或多个选定不成对的袜子,检查当前的袜子对阵列中的所有未配对的袜子。
    • 有可能建立您的阵列和“向下钻取”只有当袜子分为普通类或类型(白/黑,踝/船员,运动/礼服)比较像对等的。
    • 如果你找到一个可接受的匹配,把袜子都一起从阵列中删除。
    • 如果不这样做,把当前的袜子到阵列中的第一个开槽。
  • 每袜子重复。

这个方案的最糟糕的情况是,每双袜子就够不同,它必须精确匹配,和前n / 2袜子你选择都是不同的。 这是你的O(N 2)的情况,这是非常不可能的。 如果独特类型的短袜数为小于对P = N / 2的数量,并且在每个类型的袜子是相似的足够(通常在磨损相关的方面)该类型的任何短袜可以与任何配对其他的,那么就像我上面推断,你永远不会有比较袜子的最大数量为t,在此之后,下一个你拉匹配不成对的袜子之一。 这个场景是在平均袜子的抽屉比最坏情况更容易,减少了最坏情况的复杂性为O(n * t),其中通常牛逼<<ñ。



Answer 14:

现实世界中的方法:

尽可能快地,同时从无序一堆一个去除袜子成堆在你面前放置。 桩应布置有所空间有效地,与指向相同方向的所有袜; 桩的数量是由你可以很容易到达距离的限制。 一堆的选择上要放袜子应该是 - 尽可能快地 - 通过把袜子套在一堆显然像袜子; 偶尔的I型(把袜子套在一堆不属于)或II型(把袜子在自己的桩,当有喜欢的袜子现有桩)错误是可以容忍的-最重要的考虑因素是速度 。 一旦所有的袜子成堆,快速经过多袜子成堆创建成对和删除它们(这些盼到了抽屉)。 如果有不匹配的袜子在桩,它们重新堆放到他们最好的桩(在AS-快速的,可能限制范围内)。 当所有的多袜子桩已被处理,匹配的是并未因第二类错误配对的剩余可配对的袜子。 嗖的一声,你就大功告成了 - 我有很多的袜子,不要把它们洗干净,直到大部分是肮脏的。 另一个实际注:我翻了一双袜子的一个顶部下跌超过它们的弹性性质的其他利用,所以他们呆在一起而被运送到抽屉,而抽屉里。



Answer 15:

从你的问题很显然你没有带洗衣:)很多实际经验。 你需要的是一个小数目的非可配对的袜子的行之有效的算法。

至今这些问题的答案不好好利用我们的人的模式识别能力。 集游戏提供了如何做好这一点线索:把所有的袜子在二维空间,这样你既可以识别它们很好,很容易与您的手接触他们。 这限制了你的约120×80厘米左右的区域。 从中选择您承认对和删除它们。 把多余的袜子在自由空间和重复。 如果你洗的人容易识别的袜子(小的孩子浮现在脑海中),你可以先选择那些袜子做一个基数排序。 这种算法效果很好,只有当单个袜子的数量少



Answer 16:

拿起第一袜子,并将其放置在桌子上。 现在选择另一个袜子; 如果它的第一次拿起火柴,把它放在第一的顶部。 如果没有,把它放在桌子上从第一个小的距离。 挑三分之一袜子; 如果匹配任前两次的,将其放置在它们之上,否则将其从第三小的距离。 重复,直到你拿起所有的袜子。



Answer 17:

为了说这是如何有效地从一堆一双袜子,我们必须首先定义机器,因为配对不在于是否由图灵也不是由随机存取机,它通常被用来作为一个基础完成算法分析。

本机

该机被称为人类一个真实世界元素的抽象。 它能够通过一双眼睛从环境中读取。 而我们的机器型号是能够通过使用2个武器操作环境。 逻辑和算术运算都在使用我们的大脑(希望;-))计算。

我们还必须考虑到可以用这些仪器进行原子操作的内在运行。 由于物理限制,这是由一个臂或眼睛执行的操作具有非恒定的时间复杂度。 这是因为我们不能移动的无端一大堆袜子与手臂也不能眼睛看到的无休止一大堆袜子的品质一流的袜子。

但是物理力学给我们一些东西为好。 我们不限于与臂运动最多一个袜子。 我们可以一次移动一个整体他们夫妇。

所以,这取决于以下应该按递减顺序使用的操作之前的分析:

  • 逻辑和算术运算
  • 环保读
  • 改变环境

我们也可以利用的事实,人们只袜子的量非常有限。 所以环境修改可能涉及桩所有的袜子。

该算法

因此,这里是我的建议:

  1. 星罗棋布的袜子堆了一地。
  2. 找到一对通过观察地板上的袜子。
  3. 从2重复,直到没有对可制成。
  4. 从1重复,直到有在地板上没有袜子。

操作4是必要的,因为在地板上散布袜子时,一些袜子可能隐藏他人。 下面是该算法的分析:

分析

该算法以高概率终止。 这是由于一个事实,就是无法找到双袜子的步数2。

对于配对以下运行时分析n双袜子,我们假设至少有一半2n袜子步骤1后,不会隐藏那么在平均情况下,我们可以找到n/2对。 这意味着该环是步骤4是执行O(log n)时间。 步骤2,执行O(n^2)倍。 因此,我们可以得出结论:

  • 所述算法涉及O(ln n + n)改变环境(步骤1 O(ln n)加拾取从地板每对袜子的)
  • 所述算法涉及O(n^2)的环境从步骤2读
  • 所述算法涉及O(n^2)逻辑和算术运算为在步骤2中的短袜与另一个比较

因此,我们有一个总运行时间复杂度O(r*n^2 + w*(ln n + n))其中rw是环保读取和环境的写入操作分别袜子合理数量的因素。 逻辑和算术运算的成本都省略了,因为我们假设它需要逻辑和算术运算的恒定量来决定2个袜子是否属于同一对。 这可能不是在每一个场景中是可行的。



Answer 18:

List<Sock> UnSearchedSocks = getAllSocks();
List<Sock> UnMatchedSocks = new list<Sock>();
List<PairOfSocks> PairedSocks = new list<PairOfSocks>();

foreach (Sock newSock in UnsearchedSocks)
{
  Sock MatchedSock = null;
  foreach(Sock UnmatchedSock in UnmatchedSocks)
  {
    if (UnmatchedSock.isPairOf(newSock))
    {
      MatchedSock = UnmatchedSock;
      break;
    }
  }
  if (MatchedSock != null)
  {
    UnmatchedSocks.remove(MatchedSock);
    PairedSocks.Add(new PairOfSocks(MatchedSock, NewSock));
  }
  else
  {
    UnmatchedSocks.Add(NewSock);
  }
}


Answer 19:

我想出了另一种解决方案,它不会答应更少的操作,既耗时少,但应想看看它是否能成为一个足够好的启发式在巨大的系列袜子配对提供更短的时间消耗。

前提条件:有没有保证,有相同的袜子。 如果它们是相同的颜色,这并不意味着它们具有相同的大小或图案。 袜子是随机洗牌。 可以有奇数袜子(有些缺失,我们不知道有多少)。 准备要记住一个变量“指标”,并将其设置为0。

其结果将有一个或两个桩:1.“匹配”和2.“失踪”

启发式:

  1. 寻找最有特色的袜子。
  2. 查找其匹配。
  3. 如果没有匹配,把它的“失踪”一堆。
  4. 从1重复,直到有没有更多的最有特色的袜子。
  5. 如果有小于6只袜子,转到11。
  6. 对盲目所有的袜子到它的邻居(不包的话)
  7. 找到所有配对,包装并移动包装成对“匹配”桩; 如果没有新的比赛 - 增量“指标” 1
  8. 如果“指标”是大于2(这可能是价值依赖于袜子的数字,因为有更大数量的袜子有少配对他们盲目的机会)去11
  9. 洗好休息
  10. 去1
  11. 忘记“指数”
  12. 挑选袜子
  13. 发现其对
  14. 如果没有一双的袜子,将其移动到“丢失”堆
  15. 如果发现匹配对了,包对,并将其移动到“匹配”桩
  16. 如果仍然有一个以上的袜子去12
  17. 如果只有一个留到14
  18. 微笑满意:)

此外,还有可以增加检查是否有损坏的袜子也是,因为如果去除那些。 它可以2和3之间插入,和13和14之间。

我期待着听到任何经验或更正。



Answer 20:

当你拿起袜子,把它放在一个地方。 那么接下来的袜子,你拿起,如果它不匹配第一个袜子,设置它的第一个旁边。 如果是这样,有一对。 这样,它并不真正的问题有多少组合有,且只有两种可能性,每一个你拿起袜子 - 无论它有一个匹配这已经在你的袜子阵列中,要么没有,这意味着你它添加到阵列中的一个地方。

这也意味着,你将几乎肯定不会有阵列中的所有你的袜子,因为他们匹配的袜子会移除。



Answer 21:

袜子,无论以假乱真或一些类似的数据结构中,将在对供给。

最简单的答案是在允许待分离的对,所述对单个数据结构应该被初始化包含一个指向左侧和右侧的袜子,从而使袜子将被称为直接或经由其对。 一种短袜也可以扩展为包含一个指向它的合作伙伴。

这通过一个抽象层删除它解决任何计算配对问题。

运用同样的想法,以配对的袜子的实际问题,明显的答案是:不要让你的袜子永远是不成对的。 袜子被设置成一对,放在抽屉里的一对(可能由泥包在一起),戴为一对。 但是,在解配对是可能的点是在洗衣机,因此,所有的需要的是一个物理机制,使袜子呆在一起,并有效地清洗。

有两个物理可能性:

对于保留的指针,每个袜子上有“对”的对象,我们可以有我们用来保持袜子一起布袋。 这似乎是巨大的开销。

但对于每个袜子保持一个参考,另外,还有一个巧妙的解决办法:一波普(或“扣”,如果你是美国人),像这样的:

http://www.aliexpress.com/compare/compare-invisible-snap-buttons.html

然后你要做的就是捕捉你的袜子你一起走后立即将其赶走,并把它们放在你的清洗篮,并再次你需要删除与“对”概念的物理抽象配对的袜子的问题。



Answer 22:

当我整理袜子,我做了一个大概的基数排序 ,下探接近相同的颜色/花纹类型的其他袜。 除当我完全看不到完全匹配的情况下/附近的位置,我要删除我的袜子提取对在这一点上。

几乎所有的算法(包括由USR得分最高的答案 )排序,然后删除对。 我觉得,作为一个人,最好是尽量减少被认为一次袜子的数量。

我这样做的:

  1. 挑选一个独特的袜子(无论第一个映入我眼帘的桩)。
  2. 通过基于相似性是一个拔桩袜子开始从概念上的位置的基数排序。
  3. 基于它是如何不同的地方新袜子近到当前桩,一个距离。 如果你发现自己把袜子放在另一个,因为它是相同的顶部,形成成对出现,并删除它们。 这意味着,未来比较需要更少的努力找到正确的位置。

这需要的人类能力模糊匹配在O(1)时间,这是有点相当于建立一个计算设备上的哈希图的优点。

通过首先拉动独特的袜子,你留出空间,在这是不太鲜明的特点,以“缩小”,开始。

消除着色的FLURO之后,条纹袜子,而三对长袜子,你可能最终大多是白色的袜子由他们是多么的磨损大致分类。

在某些时候,袜子之间的差异非常小,其他人不会注意到其中的差别,并且不需要任何进一步的匹配工作。



Answer 23:

考虑大小的哈希表“N”。

如果我们假设正态分布,那么有“插入”的估计数映射到一个桶ATLEAST一个袜子是NlogN(即,所有桶满)

我已经得出这是另一个谜题的一部分,但我很乐意被证明是错误的。 这是我在同一个博客文章

让“N”对应于你有袜子的近似上限上独特的颜色数的数量/模式。

一旦你有一个碰撞(又名:比赛)只是删除一双袜子。 重复相同的实验,下一批NlogN袜子。 它的妙处在于,你可以做的,因为人的思想方法NlogN并行比较(冲突解决)。 :-)



Answer 24:

我已经采取简单的措施来减少我的精力投入到一个过程回吐O(1)时间。

通过减少我的输入两种类型的袜子之一(休闲白袜子,工作黑色的袜子),我只需要确定我手上有两个袜子。 (在技术上,因为它们是从不一起洗涤,我已经处理(0)的时间减少到O)

一些前期需要努力找到称心如意的袜子,足量购买,以消除需要您现有的袜子。 正如我我需要黑色的袜子这样做之前,我的努力是微不足道的,但里程可能会有所不同。

这样的前期工作已经见过很多次非常流行和有效的代码。 例子包括#DEFINE'ing PI几个小数(其他例子存在,但就是这样,想到现在的一个)。



Answer 25:

如果“移动”操作是相当昂贵的,“比较”操作是便宜,你需要移动整个反正设定,到缓冲区中,其中搜索是比原来的存储快很多...只是集成分拣到强制性移动。

我发现整合分类到悬挂晾干的过程是一件轻而易举的。 我需要每个反正袜子捡起,并把它挂(移动),它的成本我,没有把它挂在弦上的特定位置。 现在只要不给力搜索整个缓冲区(串),我选择将通过颜色/色调袜子。 较深左,右明亮,更加丰富多彩的前面等。现在我才挂上袜子每一个,我看在它的“右附近”如果匹配的是一个已经存在 - 这限制“扫描”到其他2-3袜子 - 如果它是,我挂的旁边,另一个。 然后,我把它们卷分成两人一组,同时从琴弦,干燥时去除。

现在,这似乎不是全部,从“形成桩按颜色”由顶尖的答案建议,但首先,不采摘离散桩,但范围,我没有问题,无论是“紫色”进行分类不同变为“红色”或“蓝色”桩; 它只是那张之间。 然后,通过将两个操作(悬挂晾干和排序),而挂像什么独立的排序将是10%排序的开销。



Answer 26:

我已经完成了我的配对的袜子只是,现在,我发现做到这一点的最好办法是:

  • 选择袜子之一,并把它放在一边(创建该对的“桶”)
  • 如果下一个是对前一个,然后把它现有的桶,否则创建一个新的。

在最坏的情况下,它意味着,你将有n / 2个不同的桶,并且你将有N-2的确定有关哪个桶包含一对电流袜子。 显然,这种算法效果很好,如果你只有几对; 我12对做到了。

它也不是那么科学,但它工作得很好:)



Answer 27:

我希望我能贡献新的东西这个问题。 我注意到,所有的答案忽视的事实,有两点在这里你可以进行预处理 ,而不会减慢您的整体的洗衣性能。

此外,我们并不需要承担大量的袜子,即使是大型的家庭。 袜子取出抽屉和磨损,他们在一个地方(也许一箱),他们被清洗之前留翻腾。 虽然我不会把说,本一LIFO堆中,我会说这是安全的假设,

  1. 人们都折腾自己的袜子大致在bin的同一区域,
  2. 垃圾桶是不是在任何时候随机的,因此,
  3. 任何子集了来自该仓通常含有对的两个袜子顶部。

由于所有的洗衣机我知道的大小(不管你有多少袜子洗)是有限的,并且发生在洗衣机的实际随机化,不管有多少袜子,我们有,我们总是有它几乎包含了不小的子集单身。

我们的两位预处理阶段“将在晾衣绳上的袜子”和“以从晾衣绳袜子”,这是我们必须做的,为了得到袜子这不仅干净而且干燥。 如洗衣机,晾衣绳是有限的,我认为我们有,我们把我们的袜子在视线的整体的一部分。

这里的算法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
}

在此之后,还剩下只有少数袜子。 这是我以前介绍未成袜子到系统中,过程中没有任何特殊的算法,其余的袜子 - 其余的袜子都很少和速度非常快,可以在视觉处理。

对于所有剩余的袜子,我认为他们的同行仍然没有洗过,放到一边为下一次迭代。 如果您注册不成对的袜子的一段时间(一个“袜子泄漏”)增长,你应该检查你的bin - 它可能会随机(你有这睡在有猫?)

我知道,这些算法采取了很多的假设:它充当某种LIFO栈的,有限的,正常的洗衣机,和有限的,正常的晾衣绳仓 - 但这仍然带有大量袜子的作品。

关于并行:只要你折腾袜子都在同一个垃圾桶,你可以很容易地并行所有这些步骤。



Answer 28:

创建将被用于不成对的袜子,使用图案作为哈希的哈希表。 遍历袜子一个接一个。 如果袜子在哈希表模式匹配,把袜子出表,并进行配对。 如果袜子没有比赛,把它放到桌子上。



Answer 29:

整理袜子的N对的问题是O(n)。 之前您在洗衣扔掉它们,你线程左边一个右边一个。 在取出来,你将线剪断,并把每一对到你的抽屉里 - 对n对2点的操作,因此为O(n)。

现在,下一个问题是,你根本就不管是不是自己洗衣服和你的妻子做她的。 这很可能是问题的一个完全不同的领域的问题。 :)



Answer 30:

我的解决方案并不完全符合您的要求,因为它正式要求O(n) “额外”的空间。 但是,考虑到我的情况是在我的实际应用非常有效。 因此,我认为它应该是有趣的。

与其他工作结合起来

在我的情况特殊的条件是我不使用烘干机,只是挂在一个普通的布机我布。 挂布需要O(n)操作(顺便说一下,我始终认为装箱这里的问题),并根据其性质的问题需要线性的“额外”的空间。 当我需要一个新的袜子从桶里我试下把它挂到它的对,如果对已经挂起。 如果从一个新的对的袜子我离开它旁边的一些空间。

甲骨文机是更好的;-)

它显然需要一些额外的工作,以检查是否已经有地方挂匹配袜子,它会使解决方案O(n^2)有关系数1/2的计算机。 但是,在这种情况下,“人的因素”,其实是一个优势-我通常可以很快(几乎O(1)识别匹配的袜子,如果它已经挂(可能是一些不知不觉中脑缓存参与) -考虑它是一种有限的“甲骨文”在甲骨文机 ;-)我们,人类必须在某些情况下,这些优势在数字机;-)

有它几乎O(n)

因此,与挂衣服的问题连接配对的袜子的问题,我得到的O(n) “额外空间”自由,并有一个解决方案,是关于O(n)时间,只需要比简单的挂布多一点的工作并允许立即访问完整的一双袜子,即使在一个非常糟糕的星期一早晨... ;-)



文章来源: How to pair socks from a pile efficiently?