关于算法:将n个项与对应的n个项进行匹配的有效方法是什么?

What is an efficient way to match n items with corresponding n items

本问题已经有最佳答案,请猛点这里访问。

考虑一组n个瓶子和一组n个盖子,这样A中的每个瓶子在B中都有独特的盖子。但是A中的瓶子和B中的盖子看起来都一样。唯一能做的比较是A中的瓶子对(A,B)和B中的盖子对(A,B),并测试A的螺纹是否更小、更大或与B的螺纹完美。

给出一个有效的算法来匹配所有瓶子和瓶盖。

附言:看来我没有做任何事情来解决问题,相信我,我做到了。请给我一个答案。


很好的问题,但正如之前所指出的,你为什么不尝试这样的事情:

你应该为每个瓶子循环(没有任何逻辑顺序)您应该将caps设置为一种动态排序的caps集合数组结构,该数组初始化时只有一个元素(即set b)。

对于每一瓶,当你得到"潜在"的瓶盖集合时,你应该使用二进制搜索在你的数组中旅行,你要逐个检查瓶盖。

  • 如果瓶盖较小,则将其放在同一组中(标记为该瓶不再使用
  • 对于第一个较大的上限,需要在当前集和下一个集之间插入一个集,并将该上限放在那里
  • 对于以下较大的大写字母,请将它们放入先前创建的集合中
  • 如果你找到了正确的瓶盖,你就有了一个匹配的瓶盖,然后继续用同一个瓶子将剩余的瓶盖分开,然后继续下一个瓶子。
  • 如果在当前设置中找不到任何上限,但已检查的所有上限都较大,则可以使用二进制搜索下限。
  • 如果在当前设置中找不到任何上限,但您检查的所有上限都较小,则可以使用二进制搜索来搜索较大的上限。

编辑:我看到了贴出来的内容,确实是复制自两套物品。集合A的每个元素在集合B中都是唯一的匹配。在O(nlogn)时间内将集合A的每个项目与集合B中的项目匹配解决方法在这里解释http://www.withom.weizmann.ac.il/~naor/jezzs/nuts_solution.html

和我的很相似,但瓶子也可以分开。