【问题标题】:Closest pair algorithm from (n log^2 n) to (n log n) time从 (n log^2 n) 到 (n log n) 时间的最近对算法
【发布时间】:2017-05-15 04:31:42
【问题描述】:

我正在尝试了解壁橱对算法如何从 n log^2 n 时间到 n log n 时间。我得到以下部分(来自http://www.cs.mcgill.ca/~cs251/ClosestPair/ClosestPairDQ.html

  1. 用线 l 将集合分成大小相等的两个部分,并递归计算每个部分的最小距离。
  2. 令 d 为两个最小距离中的最小值。
  3. 消除距离 l 大于 d 的点
  4. 根据 y 坐标对剩余点进行排序
  5. 按 y 顺序扫描剩余点,并计算每个点与其五个邻居的距离。
  6. 如果这些距离中的任何一个小于 d,则更新 d。

步骤 4 是一种需要 O(n log n) 时间的排序,它支配所有其他步骤,这是需要减少到 O(n) 以使整个算法达到 O(n log n) 时间。这是我很难理解的部分。作者提出

第 1 步:将集合划分为...,并递归计算每个部分的距离,返回每个集合中的点以按 y 坐标排序的顺序。 步骤 4:在 O(n) 时间内将两个排序列表合并为一个排序列表。

您仍然需要在递归步骤中按 y 坐标对点进行排序,这需要 O(n log n) 时间。我们怎样才能避免这种情况?合并是 O(n),但我们仍然需要在某个地方进行排序。

【问题讨论】:

    标签: algorithm sorting recursion closest-points


    【解决方案1】:

    O(n log n) 是一个问题的原因是我们一遍又一遍地这样做:如果我们将集合分成两个子集,并将这些中的每一个分成两个子集,然后涉及七种(整个集合中的一个,一半以上的两个,四分之一以上的四个)。

    因此该提案通过重用先前排序的结果来解决此问题:因此我们对最小分区进行完全合并排序(每个分区为 O(1),总计 O(n)) ,但是对于更大的分区,我们只需要进行一次 O(n) 合并传递来组合这些结果。因此,我们总共只支付 O(n log n) 次价格,这很好。

    【讨论】:

    • 谢谢 - 这个解释很有帮助,而且非常简洁明了。
    【解决方案2】:

    他们的建议是你有两个(已经排序的列表)A 和 B。可以使用 merge sort 将它们组合成一个排序列表(只是步骤 (4) 中的合并步骤)。

    归并排序的结果是一个排序后的列表,其中包含A和B的所有成员。合并后,无需再次排序。

    【讨论】:

    • 我不太明白我们已经对列表 A 和 B 进行了排序。我们首先将点列表按它们的 x 坐标排序,然后将它们分成相等的两个部分,但是这些部分是按x 坐标。我们在第 4 步中需要的是按 y 坐标排序。我似乎错过了什么。
    【解决方案3】:

    我提供了一个可能更容易理解的替代解决方案。首先根据它们的 y 坐标对所有点进行排序。这是一次使用 O (n log n) 。有 n 个点,在排序后的数组中,每个点都有一个最多为 n 的索引。保存每个点的索引(为索引添加整数到点数据结构)。然后运行原始算法。这一次,在我们要对点进行排序的那一刻,不要用普通的比较排序对它们进行排序。但是根据它们的索引对它们进行排序。我们可以使用 O(n) 中的基数排序根据它们的索引对它们进行排序。所以整个过程是O(n log n),因为我们只使用了一次比较排序,剩下的就是T(n)=2T(n/2)+O(n)。但常数不如问题中建议的修改。

    问题中建议的修改过程类似于归并排序中的合并:当我们有两个排序列表时,我们不需要使用普通排序再次对它们进行排序,我们可以将它们合并到O(n)中.

    【讨论】:

    • 在原始问题中,我们有两个排序列表,但它们是根据 x 坐标排序的。我们如何在不先按 y 坐标对它们进行排序的情况下合并它们?还是说我们应该根据 y 坐标排序的点列表找出哪些是 d 相隔的?
    • @max_max_mir,我只解释了如何修改这部分以在 O(n) 中工作:“根据 y 坐标对剩余点进行排序”。其余的保持原样。正如我解释的那样,这提高了复杂性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 2010-12-09
    • 2011-07-09
    • 2015-06-12
    • 1970-01-01
    相关资源
    最近更新 更多