【问题标题】:How to find two most distant points?如何找到两个最远的点?
【发布时间】:2011-02-13 17:51:27
【问题描述】:

这是我前段时间在面试时被问到的一个问题。而且我仍然想不出合理的答案。

问题是:

给定一组点 (x,y)。找到 2 个最远的点。相距甚远。

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

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

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

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

【问题讨论】:

  • “不久前”是一个小时的量级吗? ;-)
  • 如果你能做到O(nlogn)的排序,试试用吧。
  • 你是什么意思,加布里埃尔?按什么排序?
  • 你不能“排序”一个多维空间,或者更准确地说,你可以用许多不同的方式对其进行排序
  • @Marcelo - 没有。接近 3 年。

标签: algorithm language-agnostic geometry


【解决方案1】:

编辑:一种方法是找到凸 船体 http://en.wikipedia.org/wiki/Convex_hull 点的集合,然后是两个 远处的点是它的顶点。

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

还有:

【讨论】:

  • 问题是关于图算法,而不是计算几何,不是吗?
  • 您可以将问题建模为一个完整的加权图
【解决方案2】:

边界点算法比比皆是(寻找凸包算法)。从那里,它应该需要 O(N) 时间来找到最远的对立点。

来自作者的评论:首先在船体上找到任意一对相对的点,然后以半锁步方式绕着它走。根据边缘之间的角度,您将不得不推进一个助行器或另一个,但绕船体总是需要 O(N)。

【讨论】:

  • 现在假设所有给定的 N 个点都在凸包上。还是 O(N)?
  • 抱歉,我现在忙不过来。
  • 好吧,无论如何,您的评论是对本页正确算法的最佳解释,所以我会将其放入答案文本中然后投票。
  • 谢谢帕维尔!顺便说一句,我并没有试图不屑一顾(我最后的评论比我预期的要糟糕)。这只是一些复杂的几何形状和边缘情况才能让它正确。
  • @Marcelo,哦,在计算几何中说“完整算法”通常意味着“在变得无聊之前尽可能完整”:-)
【解决方案3】:

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

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

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

如果你仔细编写算法,你可以不用计算角度。详情请查看URL

【讨论】:

【解决方案4】:

找到最远对的随机算法是

  • 随机选择一个点
  • 找到离它最远的点
  • 重复几次
  • 删除所有访问点
  • 选择另一个随机点并重复几次。

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

【讨论】:

  • 考虑这一点,然后更正或删除你的答案,这样你就不会被否决:想象你有一组几乎是正方形的点,{A=(0, 0), B=(10, 10), C=(10, 0), D=(0, 11)};最远的点是 BD(距离 = 14.86);但是如果您尝试从 A 或 B 开始,您会很想删除 C (AC = BC = 10) 或 D (AD = 11, BD = 10.05),因为它们比对面的顶点更接近所选顶点( AC = 14.14),而实际上最长的距离实际上是 14.86
  • @sr pt:在您的示例中,CD 是最远的点,而不是 BD。从 A 或 B 开始,第 2 步总是会选择另一个,所以只有这两个在第 4 步中被删除。
【解决方案5】:

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

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

希望这会有所帮助。

【讨论】:

  • 通过返航机的固定链接URL
【解决方案6】:

求所有点的均值,测量所有点与均值的差值,取离均值最大的点,找出离均值最远的点。这些点将是凸包的绝对角和两个最远的点。 我最近为一个项目做了这个,该项目需要将凸包限制在随机定向的无限平面上。效果很好。

查看 cmets:不保证此解决方案会产生正确的答案。

【讨论】:

  • 我认为这个答案对于像我这样不是数学天才的人来说是最容易理解的。谢谢
  • 假设这是正确的,这是这个问题的最佳答案 (IMO),因为它是 O(n),可以推广到 3 个维度,并且实现起来很简单。
  • 这个算法不起作用。尝试以下几点:(-10, 0), (100, 0), (0, 70), (0, -70)。距离均值最远的点是 (100, 0),但最远的两个点是 (0, 70) 和 (0, -70)。
  • 任何使用“平均”位置(即重心)的算法都可能会因点在“坏”位置附近不均匀地聚集而产生偏差,因此恕我直言,这样的算法不太可能有效地找到正确的结果。但我想它可以在很多情况下找到一个很好的近似值。如果您对快速近似解决方案感到满意,那么“平均”算法对于均匀分布的点可以正常工作,而在边界框上选取点的方式对于不均匀分布的点也可以正常工作(使用 sqrt2)。
  • 这只适用于一维情况。甚至不是二维的:想象一个宽度为 4 和高度为 3 的 T 并且在交叉点中表示平均值。底点与平均值的距离最大,与左右点的距离只有 sqrt(2²+3²)=3.6,而不是 4。
【解决方案7】:

只是一些想法:

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

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

【讨论】:

    【解决方案8】:

    如果点以笛卡尔坐标给出,这似乎很容易。如此简单,我很确定我忽略了一些东西。随时指出我所缺少的!

    1. 找到具有 x、y 和 z 坐标最大值和最小值的点(总共 6 个点)。这些应该是所有边界点中最“遥远”的。
    2. 计算所有距离(30 个唯一距离)
    3. 求最大距离
    4. 与此最大距离对应的两个点就是您要查找的点。

    【讨论】:

    • 好的,经过进一步思考,这并不能保证找到最远的两个点。嗬!但是,它确实为您提供了由点数组描绘的区域的最小大小,不会超过 sqrt(2) 的比例。可能有用!
    【解决方案9】:

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

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

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

    【讨论】:

      【解决方案10】:

      给定一组点 {(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)

      【讨论】:

      • 首先你甚至没有证明为什么这是正确的,但这里有一个例子为什么它是错误的 {{0, 0},{10,0},{-10,0},{0 ,17}} 正确答案是 20,你的答案是 ~19.72
      猜你喜欢
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多