Java 两个数组元素的排序和配对算法

Java 两个数组元素的排序和配对算法,java,arrays,sorting,Java,Arrays,Sorting,我正在尝试配置一个高效的算法(比O(n^2)更快),用于在两个数组之间对元素进行排序和配对。但是,这需要在两个数组的元素都不能与其自身数组中的其他元素进行比较的前提下进行 编辑:数组的元素是对应于特定对象的“大小”。这个想法是,两个相同大小的部件将装配在一起。如果我们将零件称为螺钉和孔,那么螺钉只能安装在相同尺寸的孔中。但是,我们无法将孔与孔或螺钉与螺钉进行比较,以实现此算法 因此,我试图找到一种算法,它可以最好地将螺旋和孔大小的元素配对在一起,并对它们进行排序,而无需将一个元素与同一数组中的元

我正在尝试配置一个高效的算法(比O(n^2)更快),用于在两个数组之间对元素进行排序和配对。但是,这需要在两个数组的元素都不能与其自身数组中的其他元素进行比较的前提下进行

编辑:数组的元素是对应于特定对象的“大小”。这个想法是,两个相同大小的部件将装配在一起。如果我们将零件称为螺钉和孔,那么螺钉只能安装在相同尺寸的孔中。但是,我们无法将孔与孔或螺钉与螺钉进行比较,以实现此算法

因此,我试图找到一种算法,它可以最好地将螺旋和孔大小的元素配对在一起,并对它们进行排序,而无需将一个元素与同一数组中的元素进行比较

重新编辑:当从数组中比较两个元素时,我们可以知道螺钉是比它所比较的孔大还是比它小。

如果无法将“螺钉”与其他“螺钉”或“孔”与其他“孔”进行比较,则“螺钉”数组或“孔”数组都无法排序。我认为这意味着你必须依次比较一个给定的“螺丝钉”和每个“孔”,以便找到匹配的螺丝钉。这就是O(N^2)

可能有更好的解决方案,但可能需要改变问题的约束条件。特别是,表示无法比较“螺钉”或“孔”的约束是一个显示止动器。如果没有能力至少部分订购螺丝或孔,我想你别无选择,只能一次测试一对

编辑

你说你可以确定一个“螺丝钉”比一个“洞”大还是小,这对你没有帮助。具体来说,知道一个“洞”太小或太大并不能帮助你找到一个更大的“洞”

[也就是说,…除非你根据所有“孔”是小、大还是适合一个给定的“螺钉”对它们进行排序。但这是一个
O(N)
操作…一个桶排序…你需要对每个螺钉进行排序,所以你回到
O(N^2)
。如果您以增量方式进行配对,我想这种方法可能会有所帮助。但您没有这么说。]


也许这个问题的解决办法是对决定它们是否匹配的“孔”和“螺钉”的属性进行人工排序。因此,例如,可以通过直径和螺距的散列来订购螺钉。

修订版

假设当我们尝试将螺钉装入孔中时,可以得到以下三种结果之一:

  • 螺钉对于孔来说太小,因此螺钉会松动并脱落
  • 这个螺丝正好适合这个孔
  • 这个螺丝钉太大了,钻不开这个洞
  • 分而治之的解决方案。

    • 第一阶段
    • 挑一个螺丝钉
    • 使用此螺钉测试所有孔。(需要N次试验)
      • 这将所有孔分为以下三种情况之一:
      • 该孔大于测试螺钉(A)
      • 该孔与试验螺钉(B)的尺寸相同
      • 该孔小于测试螺钉(C)
    • 使用尺寸相同的孔(从B中选择)测试所有螺钉。(需要N次试验)
      • 这将所有螺钉分为以下三种情况之一:
      • 螺钉大于测试孔(D)
      • 螺钉的尺寸与测试孔(E)的尺寸相同
      • 螺钉小于测试孔(F)
      • 结果:
      • 从B中选择的任何孔都将适合从E中选择的任何螺钉。这将是隔板的“枢轴”。它们不需要任何进一步的测试
      • A组中的孔和D组中的螺钉直径比枢轴宽。组C中的孔和组F中的螺钉直径比枢轴窄
      • 因此,我们成功地将初始问题划分为两个较小的问题
    分析

    • 平均情况:
      O(N log N)
    • 最坏的情况:
      O(N^2)
      ,因为在使用透视完成对集合的分区之前,我们不知道透视的秩。与快速排序相同的分析
    关于问题的变体

    这个问题有一个变体,不可能区分松配合和精确配合。也就是说,对于每个测试,只有两种结果是可能的:

    • =
      螺钉

    这种变体要困难得多。我不知道它是否能在
    O(n logn)
    中解决(编辑)

    我不明白这个问题。“两个数组之间的排序和配对”是什么意思?如果不能在一个数组内进行比较,那么如何排序?此外,如果提供一些上下文,您将得到更好的答案。为什么会有这些特殊的限制?您可能需要在问题中加入更多的信息:结果应该如何排序(如果不能相互比较arrayelements,则按什么属性排序)。元素应该如何配对(数组A中的每一个与数组B中的一个配对,或者与多个配对?配对基于什么?随机?某些共享属性?…)。因为这是一个通用的问题,可以给出一个有用的答案,更新后会有更好的解释。确定你不需要像简单的HashMap这样的东西吗?是的。。。但是这将是
    O(N^2)
    不是吗?@Stephen:对不起,我以前的回答错了。然而,实际上有一个分治算法,它将小于
    O(N^2)
    ,但很难计算。我重写了答案以消除错误。新的答案适用于三分法的情况。为此随机化枢轴会使最坏的情况为O(nlogn),不是吗?随机化枢轴不会影响最坏的情况。(毕竟,这意味着什么