1

我知道我做错了,但想不出解决这个问题的正确方法。我正在处理下面列出的 12 个点。(1,2)(1,11)(7,8)(9,9)(12,13)​​,(13,4),(20,8),(22,3),(23,12), (24,14),(26,7),(31,10)

我把它分成两个子集

左 = (1,2)(1,11)(7,8)(9,9)(12,13)​​,(13,4)

右=(20,8),(22,3),(23,12),(24,14),(26,7),(31,10)

进一步削减

LLeft=(1,2)(1,11)(7,8)

RLeft=(9,9)(12,13)​​,(13,4)

LRight=(20,8),(22,3),(23,12)

RRight=(24,14),(26,7),(31,10)

找到每组的最小距离。

LLeft (1,2)(1,11) 是 9, (1,11)(7,8) 是 6.7, (1,2)(7,8) 是 8.48

最小值为 6.7

RLeft (9,9)(12,3) 是 6.70, (9,9)(13,4) 是 6.4, (12,3)(13,4) 是 1.14

最小值为 1.14

LRight (20,8)(22,3) 是 5.38 (20,8)(23,2) 是 5, (22,3)(23,12) 是 9.05

最小值为 5

RRight (24,14)(26,7) 是 7.28 (24,14)(31,10) 是 8.06 (26,7)(31,10) 是 5.83

最小值为 5.83

所以现在我有 LLeft、RLeft、LRight 和 RRight。我需要找到的是 LRLeft、RLLEft_Right(中间值)和 LRRight。这就是我感到困惑的地方。我能想到的获得 LRLeft 的唯一方法是获取 LLeft 和 RLEft 中的每个点并找到两者之间的距离。然后使用该距离并将其与 LLeft 和 RLeft 进行比较,这将为我提供左侧两点之间的最短距离。然后我对右边和中心做同样的事情。我很确定有一种更快更好的方法可以做到这一点,但我无法弄清楚。

4

1 回答 1

3

你应该看看http://en.wikipedia.org/wiki/Closest_pair_of_points_problem#Planar_case

这是 Step 4 的更好资源,但可以帮助您入门:在递归中,如果我们已经有最小距离d1并且d2分别在左右集合内,那么如果有一对更接近的点 - 其中一个是从左边和一个是来自正确的集合 - 那么我们只需要检查d分界线距离内的点,其中d = min(d1,d2)

于 2011-04-24T10:42:00.370 回答