求(x,y)坐标之间的最大距离
Finding maximum distance between (x,y) coordinates
我试图计算一个大的二维输入的最大曼哈顿距离,输入由(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>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)) )
处理这类问题的最佳方法是尝试建立一些小结果,这些结果将帮助您解决整个问题。
例如,对于任意三个点,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最小值的点然后计算它们之间的距离。可以有很多符合标准的点。但至少你有更少的点来检查
- 用C++程序计算圆锥体的体积、球体的体积、八边形的面积和两点之间的距离
- 计算所有对之间的曼哈顿距离
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 两个有符号数字之间的距离
- 计算车辆之间的距离并设置速度,使距离保持不变,例如 5 米
- 计算两个迭代器之间的距离时"Vector Iterators Incompatible"
- 查找彼此之间具有不同最小距离的随机数
- 相同字符之间的最小距离
- 如何排列二进制字符串以最小化它们之间的距离
- 堆和堆栈之间的距离
- 树节点之间的最大距离中的运行时错误
- 最接近的字符串:在字符串阵列中找到2个字符串之间的最小距离
- 尝试查找数组中点之间的最小距离时的随机垃圾输出
- c++ 从大型数组中读取 3D 坐标并计算它们之间的距离
- 在 OpenCV 中计算 SURF 功能之间的距离
- 计算机如何分配两个变量,我们如何计算两个变量之间的距离?
- 是否有C 功能来计算两个索引之间的距离
- 使用 DirectXMath 获得 2 点之间距离的最佳方法是什么
- <random> 点之间距离最小的uniform_real_distribution
- 确定景观中所有点与具有特定属性的点之间距离的最快方法