找到两个相同大小数组的元素之间的唯一映射

时间:2010-12-10 18:13:40

标签: algorithm

我最近在接受采访时被问到这个问题:

每个都有两个大小为'n'的数组。一个阵列有螺母,另一个有螺栓。每个螺母恰好适合一个螺栓,反之亦然。当您将螺母与螺栓进行比较时,您会得到3个结果中的一个:紧,松,合适。

如何有效地找到唯一的映射?

任何一套都无法进行排序。你永远不知道b1是否小于b2或
n1小于n2。其中n1,n2是螺母,b1,b2是螺栓。你唯一能做的就是将螺母与螺栓进行比较并得到一个结果:紧,适合,松散。

3 个答案:

答案 0 :(得分:13)

类似快速排序的算法完成了这项工作:

  1. 随机选择一个螺母n并将其用作枢轴,将一组螺栓B分成三组:紧(B1),松散(B2),适合。
  2. 将合适螺栓标记为b。现在,您将此螺栓用作枢轴,将螺母组N\n分为两组:紧(N1)或松散(N2)。
  3. 现在您有三对:N1B1nbN2B2。所有这些都是相同的大小。您可以在(N1,B2)和(N2,B1)上递归执行相同的分区,您可以得到最终答案。
  4. 很明显,复杂度为O(N log N),与快速排序相同。

答案 1 :(得分:4)

取一个螺母N0并将其与所有螺栓进行比较。根据结果​​信息,我们可以将bolt数组拆分为[bolts smaller than B0] + B0 + [bolts larger than B0]。根据问题陈述,始终有一个符合B0的唯一N0

然后选择下一个坚果N1并将其与B0进行比较。如果结果是“紧”,我们会像上面N0那样搜索较小的一半。否则,我们会做同样的事情但是更大的一半。这样做会进一步将两半中的一半分成2个。

继续这样做,直到你完成了所有坚果。这相当于quicksort。平均情况是O(N logN),但是当列表已经“排序”时,O(N ^ 2)的明显最坏情况复杂性。

答案 2 :(得分:4)