如何找到两个最遥远的点?

时间:2010-04-29 09:53:28

标签: algorithm language-agnostic geometry

这是我前一段时间在求职面试时被问过的问题。我仍然无法找到合理的答案。

问题是:

给你一组点(x,y)。找到2个最遥远的点。相互遥远。

例如,对于点:(0,0),(1,1),( - 8,5) - 最远的是:(1,1)和(-8,5),因为它们之间的距离从(0,0) - (1,1)和(0,0) - ( - 8,5)两个都更大。

显而易见的方法是计算所有点之间的所有距离,并找到最大值。问题是它是O(n ^ 2),这使得它对于大型数据集来说过于昂贵。

有一种方法是在边界上有第一个跟踪点,然后计算它们的距离,前提是边界上的点数少于“内部”,但它仍然很昂贵,并且在最坏的情况下会失败场景。

试图搜索网络,但没有找到任何明智的答案 - 尽管这可能只是我缺乏搜索技巧。

12 个答案:

答案 0 :(得分:21)

  

编辑:一种方法是找到凸起   船壳   http://en.wikipedia.org/wiki/Convex_hull   一组点然后两个   远点是这个的顶点。

可能在这里回答: Algorithm to find two points furthest away from each other

此外:

答案 1 :(得分:8)

边界点算法比比皆是(寻找凸包算法)。从那里开始,需要花费O(N)时间才能找到最远的相反点。

从作者的评论:首先在船体上找到任何一对相对的点,然后以半锁步的方式绕过它。根据边缘之间的角度,您必须前进一个步行器或另一个步行器,但总是需要O(N)来环绕船体。

答案 2 :(得分:6)

找出所有点的平均值,测量所有点和平均值之间的差异,将该点与平均值的距离最大,并找到距离它最远的点。这些点将是凸包和两个最远点的绝对角。 我最近为一个需要凸包限制在随机指向的无限平面的项目做了这个。它运作得很好。

答案 3 :(得分:3)

这个问题在算法导论中介绍。它提到1)计算凸壳O(NlgN)。 2)如果在Convex Hull上有M vectex。然后我们需要O(M)才能找到最远的一对。

我发现这个有用的链接。它包括算法细节和程序的分析。 http://www.seas.gwu.edu/~simhaweb/alg/lectures/module1/module1.html

希望这会有所帮助。

答案 4 :(得分:2)

找到最远对的随机算法将是

  • 选择一个随机点
  • 获得最遥远的观点
  • 重复几次
  • 删除所有访问过的点
  • 选择另一个随机点并重复几次。

只要您预先确定“几次”,就在O(n)中,但不能保证找到最远的一对。但是根据你的积分,结果应该是相当不错的。 =)

答案 5 :(得分:2)

您正在寻找一种算法来计算一组点的直径, Diam(S)。可以看出,这与S的凸包的直径相同, Diam(S)= Diam(CH(S))。所以首先计算集合的凸包。

现在你必须找到凸包上的所有对映点并选择具有最大距离的对。凸多边形上有 O(n)对映点。所以这给出了一个 O(n lg n)算法来找到最远的点。

此技术称为旋转卡尺。这就是Marcelo Cantos在他的回答中所描述的。

如果仔细编写算法,则无需计算角度。有关详细信息,请查看此URL

答案 6 :(得分:0)

只是一些想法:

您可能只会查看定义点集凸包的点以减少数量,但是它仍然看起来有点“不是最佳”。

否则,可能会有一个递归的四/八叉树方法来快速绑定点集之间的一些距离并消除大部分数据。

答案 7 :(得分:0)

一个起点可能是关注最近点的问题,这些问题已经过检验。维基百科列出了一些选项:

http://en.wikipedia.org/wiki/Closest_point_query

答案 8 :(得分:0)

如果以笛卡尔坐标给出点,这似乎很容易。很容易,我很确定我忽略了什么。随意指出我错过的东西!

  1. 找到具有x,y和z坐标的最大值和最小值的点(总共6个点)。这些应该是所有边界点中最“偏远”的。
  2. 计算所有距离(30个独特距离)
  3. 查找最大距离
  4. 与此最大距离对应的两个点是您正在寻找的点。

答案 9 :(得分:0)

这是一个很好的解决方案,它适用于 O(n log n)。它被称为旋转卡尺方法。 https://www.geeksforgeeks.org/maximum-distance-between-two-points-in-coordinate-plane-using-rotating-calipers-method/

首先你找到凸包,你可以用格雷厄姆扫描在 O(n log n) 中制作它。只有凸包的点才能为您提供最大距离。该算法按顺时针遍历排列凸包的点。稍后将使用此属性。

其次,对于凸包上的所有点,您需要找到该包上最远的点(这里称为对映点)。您不必单独找到所有对映点(这将给出二次时间)。假设凸厅的点称为 p_1, ..., p_n,它们的顺序对应于顺时针遍历。凸多边形有一个属性,当你以顺时针顺序遍历外壳上的点 p_j 并计算距离 d(p_i, p_j) 时,这些距离首先不会减少(可能会增加)然后不会增加(可能会减少)。因此,在这种情况下,您可以轻松找到最大距离。但是,当您为 p_i 找到正确的对映点 p_j* 时,您可以使用从该 p_j^* 开始的候选点开始对 p_{i+1} 的搜索。您不需要检查所有以前看到的点。总共 p_i 遍历点 p_1, ..., p_n 一次,p_j 最多遍历这些点两次,因为 p_j 永远赶不上 p_i,因为它会给出零距离,当距离开始减小时我们停止。

答案 10 :(得分:-1)

给定一组点{(x1,y1),(x2,y2)...(xn,yn)}找到2个最远点。

我的方法:

1)。你需要一个参考点(xa,ya),它将是:
xa =(x1 + x2 + ... + xn)/ n
ya =(y1 + y2 + ... + yn)/ n

2)。计算从点(xa,ya)到(x1,y1),(x2,y2),...(xn,yn)的所有距离
第一个"最远点" (xb,yb)是具有最大距离的那个。

3)。计算从点(xb,yb)到(x1,y1),(x2,y2),...(xn,yn)的所有距离
另一个"最遥远的点" (xc,yc)是具有最大距离的那个。

所以你在O(n)

中获得了最远点(xb,yb)(xc,yc)

例如,对于点:(0,0),(1,1),( - 8,5)

1)。参考点(xa,ya)=(-2.333,2)

2)。计算距离:
从(-2.333,2)到(0,0):3.073
从(-2.333,2)到(1,1):3.480
从(-2.333,2)到(-8,5):6.411
所以第一个最远点是(-8,5)

3)。计算距离:
从(-8,5)到(0,0):9.434
从(-8,5)到(1,1):9.849
从(-8,5)到(-8,5):0
所以另一个最遥远的地方是(1,1)

答案 11 :(得分:-2)

看直角三角形A-(x1,y1),B-(x2,y2)和距离b / w A和B是= sqrt [(| x1 | + | x2 |)^ 2 +(| Y1 | + | Y2 |)^ 2]