最近对算法

时间:2011-04-22 16:39:17

标签: algorithm closest

我想了解最近的对算法。我理解将这一组分成两半。但我无法理解如何递归计算最近的一对。我理解递归,但不明白如何通过递归计算最接近的对。如果你有(1,2)(1,11)(7,8)递归如何在这些上工作?

4 个答案:

答案 0 :(得分: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 中的一个点与一个点之间的距离。 →<子>右
  4. 我们还需要检查左右两个点之间的距离是否较短。诀窍在于,因为我们知道距离必须小于δ left 和δ right ,所以从两个细分点考虑的距离都不足以超过min(δ left ,δ right )来自分界线(用于分割原始列表L的x坐标)。这种优化使得程序比蛮力方法更快,实际上是O(n log n)。

答案 1 :(得分:7)

如果您的意思是this algorithm,请执行以下操作:

  1. 分类点:(1,2)(1,11)(7,8)
  2. 构建两个子集:(1,2)(1,11)和(7,8)
  3. 分别在(1,2)(1,11)和(7,8)上运行算法&lt; =这是递归的来源。结果是dLmin = 9和dRmin =无穷大(右边没有第二个点)
  4. dLRmin = sqrt(45)
  5. result = min(dLmin,dRmin,dLRmin)= sqrt(45)
  6. 递归包含与上面相同的步骤。例如。用(1,2)和(1,11)调用:

    1. 分类点:(1,2)(1,11)
    2. 构建两个子集:(1,2)和(1,11)
    3. 分别在(1,2)和on(1,11)上运行算法&lt; =再次递归调用。结果是dLmin =无穷大,dRmin =无穷大
    4. dLRmin = 9
    5. result = min(dLmin,dRmin,dLRmin)= 9

答案 2 :(得分:1)

我想我知道你在说什么算法。我自己可以在这里重新讲述它,但Introduction to Algorithms中给出的描述远远超出了我的能力。这一章也可以在谷歌书籍上找到:enjoy。 (其他人也可以在那里找到问题描述)

答案 3 :(得分:0)

也许Linear-time Randomized Closest Pair算法会有所帮助。在那里,您可以在预期的时间O(n)中找到该对。