6

我试图了解最接近的配对算法。我了解将集合分成两半。但我无法理解如何递归计算最接近的对。我了解递归,但不了解如何通过递归计算最接近的对。如果你有 (1,2)(1,11)(7,8) 递归将如何处理这些?

4

4 回答 4

8

该算法的基本思想是这样的。

你有一组点 P,你想找到 P 中距离最短的两个点。

一个简单的蛮力方法将遍历 P 中的每一对,计算距离,然后取距离最短的一对。这是一个 O(n²) 算法。

但是,您正在谈论的算法可能会更好。这个想法是首先根据其中一个坐标对所有点进行排序,例如 x 坐标。现在你的集合 P 实际上是一个排序的点列表,按它们的 x 坐标排序。该算法现在将输入不是一组点,而是一个排序的点列表。我们将算法称为 ClosestPair(L),其中 L 是作为参数给出的点列表。

ClosestPair(L) 现在递归实现如下:

  1. 将列表 L 在其中间拆分,得到 L left和 L right
  2. 递归求解 ClosestPair(L left ) 和 ClosestPair(L right )。让δ left和δ right得到相应的最短距离。
  3. 现在我们知道原始集合中的最短距离(由 L 表示)要么是两个 δ 之一,要么是 L left中的一点与 L right中的一点之间的距离。
  4. 我们仍然需要检查左右细分的两点之间的距离是否更短。诀窍在于,因为我们知道距离必须小于 δ left和 δ right ,所以从两个细分点考虑距离分界线(x 坐标)不远于 min(δ left , δ right ) 的点就足够了您曾经拆分原始列表 L)。这种优化使该过程比蛮力方法更快,实际上是 O(n log n)。
于 2011-04-22T17:43:46.077 回答
7

如果您指的是此算法,请执行以下操作:

  1. 排序点: (1,2) (1,11) (7,8)
  2. 构建两个子集:(1,2) (1,11) 和 (7,8)
  3. 分别在 (1,2) (1,11) 和 (7,8) 上运行算法 <= 这就是递归的来源。结果是 dLmin = 9 和 dRmin = 无穷大(右边没有第二个点)
  4. dLRmin = sqrt(45)
  5. 结果 = min(dLmin, dRmin, dLRmin) = sqrt(45)

递归由与上述相同的步骤组成。例如,使用 (1,2) 和 (1,11) 调用会:

  1. 排序点:(1,2) (1,11)
  2. 构建两个子集:(1,2) 和 (1,11)
  3. 分别在 (1,2) 和 (1,11) 上运行算法 <= 再次递归调用。结果是 dLmin = 无穷大和 dRmin = 无穷大
  4. dLRmin = 9
  5. 结果 = min(dLmin, dRmin, dLRmin) = 9
于 2011-04-22T16:55:48.247 回答
1

我想我知道你在说什么算法。我可以自己在这里复述它,但是算法简介中给出的描述远远优于我所能产生的。谷歌书籍上也有该章节:享受。(其他人也可以在那里找到问题描述)

于 2011-04-22T16:55:36.497 回答
0

也许线性时间随机最近对算法会有所帮助。在那里你可以在预期的时间 ​​O(n) 中找到这对。

于 2019-06-12T07:03:11.967 回答