【问题标题】:Algorithm for sorting and pairing elements of 2 arrays用于对 2 个数组的元素进行排序和配对的算法
【发布时间】:2010-10-02 22:35:36
【问题描述】:

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

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

因此,我正在尝试找到一种算法,该算法将最好地将这些螺钉和孔尺寸的元素配对在一起,并对它们进行排序,而无需将元素与同一数组中的元素进行比较。

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

【问题讨论】:

  • 我不明白这个问题。 “两个数组之间的排序和配对”是什么意思?如果你不能在一个数组内进行比较,你如何排序?
  • 另外,如果你提供一些上下文,你会得到更好的答案。为什么会有这些特殊的限制?
  • 您可能会在您的问题中添加更多信息:结果应该如何排序(通过什么属性,如果您无法将数组元素相互比较)。以及元素应该如何配对(数组 A 中的每个与数组 B 中的一个,或多个?配对基于什么?随机?一些共享属性?...)。因为问题是通用的方法来给出有用的答案
  • 更新了一些更好的说明。
  • 确定不需要简单的 HashMap 之类的东西?

标签: java arrays sorting


【解决方案1】:

修订

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

  1. 螺丝太小,无法打孔,导致螺丝松动脱落。
  2. 螺丝与孔完全吻合。
  3. 螺丝对于孔来说太大了。

分而治之的解决方案。

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

分析

  • 平均情况:O(N log N)
  • 最坏情况:O(N^2),因为在我们使用枢轴完成对集合的分区之前,我们不知道枢轴的等级。与 QuickSort 的分析相同。

关于问题的变体

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

  • <螺丝
  • >=螺丝

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

【讨论】:

  • 是的......但这将是O(N^2) 不是吗?
  • @Stephen:对不起,我的旧答案是错误的。不过其实它有分治算法,会小于O(N^2),但是计算起来很困难。
  • 我重写了答案以消除错误。新答案适用于三分法。
  • 为此随机化支点会使最坏的情况变成 O(nlogn) 不是吗?
  • 随机化枢轴不会影响最坏的情况。 (毕竟,worst case 是什么意思?)不幸的是,median-of-three 方法不起作用,因为枢轴(在本例中为三个螺母或三个螺栓)无法相互比较。
【解决方案2】:

如果不能将“screws”与其他“screws”或“holes”与其他“holes”进行比较,则“screws”数组或“holes”数组都无法排序。我认为这意味着您必须依次将给定的“螺钉”与每个“孔”进行比较才能找到匹配项。那是O(N^2)

可能有更好的解决方案,但它可能需要更改对您的问题的限制。特别是,说你不能比较“螺丝”或“孔”的约束是一个表演障碍。如果无法至少部分订购螺钉或孔,我认为您别无选择,只能一次测试一对。

编辑

您可以确定“螺钉”是否大于或小于“孔”的说法没有帮助。具体来说,知道“洞”太小或太大并不能帮助您找到尺寸更接近的“洞”。

[也就是说……除非你根据它们是否更小、更大或是否适合给定的“螺钉”来对所有“孔”进行排序。但这是一个O(N) 操作......一个桶排序......你需要为每个螺丝做这个,所以你回到O(N^2)。我认为,如果您逐步执行此配对过程,这种方法可能会有所帮助。但你没有这么说。]

也许这个问题的解决方案是对决定它们是否匹配的“孔”和“螺钉”的那些属性进行人工排序。例如,可以根据直径和螺距的哈希值对螺钉进行排序。

【讨论】:

  • 不建议排序更多的是快速排序的变体,即 O(N*log(N) ) 然后 O(N^2)。正如我所看到的,你会拿一个螺丝,把孔分类成更小、相等和更大,然后用相同的孔把螺丝分类成更小、相等(好的,我们知道答案)和更大,现在你必须更小的阵列每个都可以递归排序,为我们提供了一种分而治之的方法。
  • @Grizzly :我说的是为每个螺丝做这种排序; N次快速排序将是O(N*N*log(N))
猜你喜欢
  • 2016-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
相关资源
最近更新 更多