求(x,y)坐标之间的最大距离

Finding maximum distance between (x,y) coordinates

本文关键字:之间 距离 坐标      更新时间:2023-10-16

我试图计算一个大的二维输入的最大曼哈顿距离,输入由(x, y)s组成,我想要做的是计算这些坐标之间的最大距离在少于O(n^2)的时间内,我可以在O(n^2)内完成,通过遍历所有元素,例如:
*(两点(X1,Y1)与(X2,Y2)之间的曼哈顿距离为:|X1-X2| + |Y1-Y2|)

for ( 0 -> n )  
   for ( 0-> n )   
       { // here i calculate |Xi - Xj| + |Yi - Yj| which is maximum }  

但是对于非常大的输入,它将不能有效地工作:(
有人有更好的算法吗?

只有两种情况需要考虑,如果我们只考虑Xi <= Xj .

  • 如果Yi <= Yj,则距离为(Xj + Yj) - (Xi + Yi)
  • 否则,距离为(Xj - Yj) - (Xi - Yi)

通过将其分解为这些情况,我已经摆脱了绝对值函数,使其更容易推断距离。

因此,我们简单地选择具有最小和最大x+y的点,并计算距离。然后选取x-y最小和最大的点,计算距离。这两个距离中的一个是你的最大值。

这可以在O(n)中完成,它是渐近最优的。

相当简单,可以在O(n)

中计算

x1>x2y1>y2

max(|x1-x2|+|y1-y2|) = max(x1-x2+y1-y2) = max(x1+y1) - min(x2+y2)

x1>x2y1<y2

max(|x1-x2|+|y1-y2|) = max(x1-x2-y1+y2) = max(x1-y1) - min(x2-y2)

现在把x1换成x2,得到同样的结果。

一般来说你的解是

max ( (max(xi+yi)-min(xi+yi)), (max(xi-yi) - min(xi-yi)) ) 

处理这类问题的最佳方法是尝试建立一些小结果,这些结果将帮助您解决整个问题。

例如,对于任意三个点,A, B和C,它的条件是B 之间(稍后会详细介绍)A和C, B离第四个点D的距离永远不会比A和C中的一个更远。用标准的欧几里德距离度量,如果一个点位于连接它们的线段上,那么它就在另外两个点之间。对曼哈顿的测量就没那么简单了——部分原因是人们还没有很好地理解分段的概念。

描述'between'的更一般的方法是这样的(使用从A到B的距离为|AB|的符号):如果|AB| + |BC| = |AC|

则点B位于两点A, C之间

你可以看到在欧氏距离中这意味着B位于连接A和c的线段上

在曼哈顿距离中,这意味着点B包含在由A和C定义的矩形中(当然,如果AC平行于其中一个轴,则可以是直线段)。

这个结果意味着对于任何点,如果它位于两个现有点之间,它与添加到集合中的任何新点之间的距离不可能比它周围的两个点更远。

现在,这个信息并不能为你解决问题,但它确实让你放弃了许多潜在的未来计算。一旦你确定了一个点在另外两个点之间,再跟踪它就没有意义了。

所以,你可以通过只跟踪最外面的点来解决这个问题,而忽略掉任何落在里面的点。

对于临时观察者来说是一个有趣的练习

证明你可以有不超过4个不同的点,并且在曼哈顿意义上,没有一个点位于其他两个点之间。

有了第二个结果,很明显你只需要跟踪最多4个点。

已经提出的其他一些方法可能更快,但这种方法更有趣!

额外学分

将这些想法推广到n维度

第一个重大改进将是:

for ( X: 0 -> n )
    for ( Y: X -> n )
        { compute the distance between X and Y }

由于X和Y之间的距离与Y和X之间的距离相同,因此可以将计算量减少一半…

最大距离将是相距最远的点之间的距离。你只需要找到X最大值和Y最大值的点然后找到X最小值和Y最小值的点然后计算它们之间的距离。可以有很多符合标准的点。但至少你有更少的点来检查