我试图计算大型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 }
但是对于非常大的输入它不会有效:(
谁有任何想法更好的算法?
答案 0 :(得分:14)
如果只考虑Xi <= Xj
的结果,则只需要考虑两种情况。
Yi <= Yj
,则距离为(Xj + Yj) - (Xi + Yi)
(Xj - Yj) - (Xi - Yi)
通过将其分解为这些情况,我已经摆脱了绝对值函数,使得更容易推断距离。
因此,我们只选择具有最小和最大x+y
的点,并计算距离。然后选择具有最小和最大x-y
的点,并计算距离。这两个距离中的一个是你的最大距离。
这可以在O(n)
中完成,这是渐近最优的。
答案 1 :(得分:9)
这很简单,可以在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)
现在用x2更改x1,你会得到相同的结果。
所以一般来说你的解决方案是
max ( (max(xi+yi)-min(xi+yi)), (max(xi-yi) - min(xi-yi)) )
答案 2 :(得分:2)
这样的问题最好的办法是尝试建立一些可以帮助解决整体问题的小结果。
例如,确定对于任何三个点A,B和C来说并不难,这些点具有B 之间的条件(在一秒钟内更多)A和C,B将永远不会离第四点D而不是A和C中的一个。对于标准的欧几里德距离度量,如果点位于连接它们的段上,则点在两个其他点之间。对于曼哈顿测量而言,它并非如此简单 - 部分原因是因为段的概念不是很清楚。
描述'之间'的更一般的方法是这样(使用从A到B的距离是| AB |的表示法): 如果| AB |,则点B在两个点A,C之间+ | BC | = | AC |
你可以看到,在欧几里德距离中,这意味着B位于连接A和C的段上。
在曼哈顿距离,这意味着B点包含在由A和C定义的矩形中(如果AC与轴平行,则当然可以是直线段)。
这个结果意味着对于任何一点,如果它位于两个现有点之间,那么添加到集合中的任何新点都不会比围绕它的两个点更远。
现在,这些信息并没有为您解决问题,但它确实让您丢掉了许多潜在的未来计算。一旦确定某个点位于另外两个点之间,就没有必要跟踪它。
所以,你可以通过只跟踪最外面的点来解决这个问题,并且忽略任何落在它内部的点。
对于不经意的观察者来说,这是一项有趣的练习
证明你可以拥有不超过4个不同点,这样在曼哈顿意义上,其他两个点之间都没有。
有了第二个结果,很明显你只需要追踪4个点。
已经展示的其他一些方法可能更快,但这种方式更有趣!
额外信用
将这些想法概括为 n 维度
答案 3 :(得分:0)
第一个重大改进是:
for ( X: 0 -> n )
for ( Y: X -> n )
{ compute the distance between X and Y }
因为X和Y之间的距离与Y和X之间的距离相同,这会使你的计算减少一半......
答案 4 :(得分:-2)
最大距离将介于最远离彼此的点之间。因此,您只需找到具有最大X和最大Y的点,然后找到具有最小X和最小Y的点并计算它们之间的距离。 可能有很多点符合标准..但至少你会有更少的点数来检查