Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何找到两个最远的点?_Algorithm_Language Agnostic_Geometry - Fatal编程技术网

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

Algorithm 如何找到两个最远的点?,algorithm,language-agnostic,geometry,Algorithm,Language Agnostic,Geometry,这是我不久前在一次工作面试中被问到的一个问题。我仍然无法找到合理的答案 问题是: 给你一组点(x,y)。找到两个最远的点。彼此疏远 例如,对于点:(0,0),(1,1),(-8,5),最远的是:(1,1)和(-8,5),因为它们之间的距离比(0,0)-(1,1)和(0,0)-(8,5)都大 显而易见的方法是计算所有点之间的所有距离,并找到最大值。问题是它是O(n^2),这使得它对于大型数据集来说非常昂贵 有一种方法是首先跟踪边界上的点,然后计算它们的距离,前提是边界上的点比“内部”的点少,但这仍

这是我不久前在一次工作面试中被问到的一个问题。我仍然无法找到合理的答案

问题是:

给你一组点(x,y)。找到两个最远的点。彼此疏远

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

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

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


试图搜索网页,但没有找到任何合理的答案——尽管这可能只是因为我缺乏搜索技能。

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

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

请考虑以下几点:

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

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

编辑:一种方法是找到凸面 船体 点的集合,然后是两个 远处的点是该点的顶点

可能回答如下:

此外:


寻找最远对的随机算法是

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

你在O(n)中,只要你预先决定“几次”,但不能保证找到最远的一对。但取决于你的分数集,结果应该相当不错

这个问题在算法简介中介绍。它提到1)计算凸壳O(NlgN)。2) 如果凸壳上有M个向量。然后我们需要O(M)来找到最远的一对

我发现这些链接很有用。包括算法细节分析和程序设计。


希望这会有帮助。

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

现在你必须找到凸壳上的所有对足点,然后选择距离最大的对。凸多边形上有O(n)个反足点。这就给出了一个求最远点的O(nlgn)算法

这种技术称为旋转卡钳。这就是马塞洛·坎托斯在回答中所描述的


如果你仔细编写算法,你可以不用计算角度。有关详细信息,请勾选此项。

如果点以笛卡尔坐标表示,这似乎很容易。很容易,我很确定我忽略了什么。请随时指出我遗漏了什么

  • 找到具有x、y和z坐标的最大值和最小值的点(总共6个点)。这些应该是所有边界点中最“遥远”的
  • 计算所有距离(30个唯一距离)
  • 找到最大距离
  • 与此最大距离对应的两个点就是您要查找的点
  • 给定一组点{(x1,y1),(x2,y2)…(xn,yn)}找到两个最远的点

    我的做法:

    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)

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


    请参阅注释:此解决方案不能保证提供正确答案。

    是“一段时间以前”的,大约一小时?;-)如果你能用O(nlogn)进行排序,试着用它。你是什么意思,加布里埃尔?按什么排序?您不能“排序”多维空间,或者更准确地说,您可以按多种不同的方式对其进行排序ways@Marcelo-不。接近3年。现在假设所有给定的N点都在co上