找到2D空间中的两个最远点(曼哈顿距离)

时间:2016-12-26 06:24:06

标签: algorithm

给定2D空间中的点列表(x [i],y [i]),我们需要找到两个最远点(曼哈顿距离)。

我知道算法,但我不太明白它是如何工作的。

  1. 找到以下几点:max(x [i] + y [i]),max(-x [i] + y [i]),max(-y [i] + x [i] )和所有i中的最大值(-x [i] - y [i])。

  2. 计算列表中每个点与上一步中选择的四个点之间的距离,然后选择最大的点。

  3. 有人请解释为什么这个算法是正确的。

3 个答案:

答案 0 :(得分:3)

我们必须最大化曼哈顿距离,其中P =(X,Y)是从集合中任意固定的

MD = Abs(X - x[i]) + Abs(Y - y[i])

有四种情况:

1最远的点是从P(不严格地,x[i]<=X, y[i]<=Y)左下,所以我们可以打开Abs-bracket

MD =  X - x[i] + Y - y[i]

(-x[i] - y[i])最大时达到此表达式的最大值

2最远的点是P的左上方,所以

MD =  X - x[i] - Y + y[i]

(-x[i] + y[i])最大时达到此表达式的最大值

同样的逻辑是针对右上和右下的情况。

因此,我们可以看到任何P(属于集合)的最远点必须从这四个变量中选择(称为极值点)。

改述:

如果我们从集合中选择任何点P,那么它的最远点是极值E.但是极值点的最远点是E1 - 极值点! (可能是P,如果P是极值的话)。

答案 1 :(得分:1)

P1 = (x1, y1)P2 = (x2, y2) s.t. d(P1, P2) = |x1-x2| + |y1-y2|是最大的。

让我们假设x1 >= x2y1 >= y2(其他情况非常相似,你必须使用其他最大点)。然后:

d(P1, P2) = x1 - x2 + y1 - y2 (1)

P3 = (x3, y3) s.t. x3 + y3是最大的。我们的目标是展示d(P3, P2) >= d(P1, P2)

根据定义x3 + y3 >= x1 + y1 (2)。由(1)和(2):

  • 如果x3 <= x2,则:d(P3, P2) = x2 - x3 + y3 - y2 >= x2 - x3 + (x1 + y1 - x2) - y2 = x1 + y1 - x3 - y2 >= x1 - x2 + y1 - y2 = d(P1, P2)
  • 如果y3 <= y2:对称案例。
  • 其他x3 >= x2y3 >= y2d(P3, P2) = x3 - x2 + y3 - y2 >= x1 - y2 + y1 - y2 = d(P1, P2)

因此d(P3, P2) >= d(P1, P2)d(P3, P2) <= d(P1, P2),因此在这种情况下算法是正确的。

几何证明:让我们翻译点,以便P2现在是(0, 0)。然后,该组的直径是到达最大直径的闭合球上的点的距离。曼哈顿距离的球是正方形,其边与坐标轴成pi/4角。在这种情况下,公式很容易找到(它只取决于最大距离点位于哪个象限)。

答案 2 :(得分:0)

我不能给你一个超级技术或详细的答案,但直觉上,这是有道理的。

您首先找到角点的原因是因为两点之间的最大曼哈顿距离将始终包含角点。如果没有那么它只能等于或小于。这使得对于大型阵列而言,您不必搜索每个组合,因此您的搜索将更加高效。如果它有助于对其进行描绘,则在图表上显示6个点。在任何可能的位置画出4个角点。然后尝试画出一种方式,其中内部两点比具有角点的任何其他点更远。希望这可以帮助。我知道这不是很技术性的。