找到(x,y)坐标之间的最大距离
Posted
技术标签:
【中文标题】找到(x,y)坐标之间的最大距离【英文标题】:Finding maximum distance between (x,y) coordinates 【发布时间】:2011-11-04 08:40:58 【问题描述】:我正在尝试计算大型 2D 输入的最大曼哈顿距离,输入由 (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
但是对于非常大的输入它不会有效地工作:( 有人对更好的算法有任何想法吗?
【问题讨论】:
【参考方案1】:只有两种情况需要考虑,如果我们只考虑Xi <= Xj
这样的结果。
Yi <= Yj
,则距离为(Xj + Yj) - (Xi + Yi)
否则距离为(Xj - Yj) - (Xi - Yi)
通过将其分解为这些情况,我摆脱了绝对值函数,从而更容易推理距离。
因此,我们只需选择具有最小和最大 x+y
的点,然后计算距离。然后选择具有最小和最大x-y
的点,并计算距离。这两个距离之一是您的最大值。
这可以在O(n)
中完成,这是渐近最优的。
【讨论】:
【参考方案2】:比较简单,可以在O(n)
中计算
让x1>x2
和y1>y2
max(|x1-x2|+|y1-y2|) = max(x1-x2+y1-y2) = max(x1+y1) - min(x2+y2)
让x1>x2
和y1<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)) )
【讨论】:
【参考方案3】:处理此类问题的最佳方法是尝试建立一些有助于解决整体问题的小结果。
例如,对于任意三个点 A、B 和 C,确定 B 是 在之间的条件并不难(稍后将详细介绍)A 和C、B 永远不会比 A 和 C 中的一个离第四点 D 更远。使用标准的欧几里得距离度量,如果一个点位于连接它们的线段上,则它位于另外两个点之间。对于曼哈顿测量,它并不是那么简单 - 部分原因是分段的概念还没有被很好地理解。
描述“之间”的更一般的方式是(使用从 A 到 B 的距离为 |AB| 的符号): 如果 |AB|,则点 B 位于两点 A、C 之间+ |BC| = |交流|
您可以看到,在欧几里得距离中,这意味着 B 位于连接 A 和 C 的线段上。
在曼哈顿距离中,这意味着点 B 包含在由 A 和 C 定义的矩形中(如果 AC 平行于轴之一,则当然可以是直线段)。
这个结果意味着对于任何点,如果它位于两个现有点之间,那么它与添加到集合中的任何新点的距离不能比它周围的两个点更远。
现在,这些信息并不能为您解决问题,但它确实让您放弃了许多潜在的未来计算。一旦您确定一个点位于其他两个点之间,就没有必要跟踪它了。
因此,您可以通过仅跟踪最外层的点来解决此问题,而忽略任何落在其中的点。
对于不经意的观察者来说是一个有趣的练习
证明你最多可以有 4 个不同的点,使得没有一个点在曼哈顿意义上的其他两个点之间。
有了第二个结果,很明显您只需要跟踪最多 4 个点。
已经介绍的其他一些方法可能更快,但这种方式更有趣!
额外积分
将这些想法推广到 n 个维度
【讨论】:
【参考方案4】:第一个重大改进是:
for ( X: 0 -> n )
for ( Y: X -> n )
compute the distance between X and Y
因为 X 和 Y 之间的距离与 Y 和 X 之间的距离相同。这将使您的计算量减少一半...
【讨论】:
是的,这是一个改进,但仍然需要 O(n^2) 时间 :( 这不适用于非常大的输入 是的,我知道,我只是指出了第一个明显的改进:将比较次数减半仍然是一个很大的改进。我还在考虑更快的方法...【参考方案5】:最大距离将是彼此最远的点之间。因此,您只需找到具有最大 X 和最大 Y 的点,然后找到具有最小 X 和最小 Y 的点并计算它们之间的距离。 可能有很多符合标准的点..但至少你要检查的点要少得多
【讨论】:
否,导致最大 X 的坐标,可能没有最大 Y !最低限度也是如此,请考虑以下: (7,-2) , (-1,5) , (3,-9) 等等,这 3 个将不赞成您的算法以上是关于找到(x,y)坐标之间的最大距离的主要内容,如果未能解决你的问题,请参考以下文章