最接近的一对点采用不同的方法

时间:2016-01-21 16:03:56

标签: algorithm divide-and-conquer

我试图解决这个问题,我想出了一个如下解决方案,这与" Wikipedia"算法。我无法理解我的解决方案有什么问题,这也是O(nlogn)。

输入:沿x-y轴的坐标集。 {(2,4),(5,3),(3,7),(4,2),(6,3)}

我的解决方案:

  1. 按给定的集合wrt x坐标排序。 {(2,4),(3,7),(4,2),(5,3),(6,3)}。 复杂性O(nlog)
  2. 找到min {连续对之间的距离},我们称之为min_x。 复杂性O(n)
  3. 按给定的集合wrt y坐标排序。 {(4,2),(5,3),(6,3),(2,4),(3,7)}。复杂性O(nlog)
  4. 找到min {连续对之间的距离},让我们称之为min_y。复杂性O(n)
  5. min_d = min(min_x,min_y)导致min_d的对是最短距离的对。
  6. 这是错的吗?我错过了什么?

3 个答案:

答案 0 :(得分:4)

是的,这是错误的。考虑集合{(0,0),(0,10),(10,0),(0.2,0.2)}作为计数器示例。你的方法永远不会有(0,0)和(0.2,0.2)作为任何一个排序中的连续元素,因此永远不会被认为是彼此最接近的两个点。

答案 1 :(得分:3)

你的算法会产生一个错误的最佳对,例如以下示例:

var points : [(Int,Int)] = [(0,0),(1,10),(10,1),(3,3)]

/* xmin solution: (1,10), (3,3) (dist = sqrt(4+49) = sqrt(53))
   from sorted list: (0,0),(1,10),(3,3),(10,1)                 */

/* ymin solution: (10,1), (3,3) (dist = sqrt(53))
   from sorted list: (0,0),(10,1),(3,3),(1,10)                 */

/* real solution: (0,0), (3,3) (dist = sqrt(18) < sqrt(53))    */

答案 2 :(得分:0)

是的,这是错误的。当x ^ 2或y ^ 2中的任何一个最小时,sqrt(x^2 + y^2)的最小都没有必要。

最知名的解决方案的时间复杂度为O(nlogn)。 第1039页的{3}}第33.4节中可以找到解决方法。

无需阅读整章,只需33.4节即可。