放置一个点以最小化距离最远点的距离

时间:2012-07-02 23:33:39

标签: algorithm math geometry

我有一个问题,

给定一组点,如何设置一个点,使得距离最远点的距离尽可能小?

这是针对this问题。我不知道该怎么办。有人指点吗?

由于

2 个答案:

答案 0 :(得分:1)

您需要使用Voronoi diagram,可能是Farthest-Point Voronoi图,其中平面被划分为区域,其中同一区域中的点具有相同的fartherst点

<强>更新

首先需要构建一个Farthest-Point voronoi图,即O(nlogn)时间,并找到所有顶点中最小圆的中心(如果圆由三个点定义)和所有边(如果圆由两点定义)。此方法的总时间复杂度为 O(nlogn)

我刚看到Smallest circle problem维基页面,似乎有一个 O(n)时间算法。如果您关心速度,可以查看它,否则不要介意。

答案 1 :(得分:1)

查看此页面。它描述了几种方法。 http://www.personal.kent.edu/~rmuhamma/Compgeometry/MyCG/CG-Applets/Center/centercli.htm

如果上面的链接死了,这里是描述最直接方法的相关部分:


一个O(n2)时算法

  1. 在中心绘制一个圆圈,c,使得给定集合的点位于圆圈内。显然,这个圆圈可以做得更小(或者我们有解决方案)。
  2. 通过找到距离圆圈中心最远的点A,并绘制一个具有相同中心并通过A点的新圆圈,使圆形变小。这两个步骤产生一个较小的圆圈。新圆圈较小的原因是这个新圆圈仍然包含给定集合的所有点,除非它现在通过最远点x,而不是封闭它。
  3. 如果圆圈经过2个或更多点,请继续执行步骤4.否则,通过将中心移向A点使圆圈变小,直到圆圈与该组中的另一个B点接触为止。
  4. 在这个阶段,我们是一个圆圈,C,它穿过给定集合的两个或多个点。如果圆的圆弧间隔(无点间隔)大于圆的圆周的一半,没有任何点,圆可以做得更小。设D和E为该无点间隔末端的点。在将D和E保持在圆的边界上时,减小圆的直径,直到我们有(a)或(b)的情况。

    • 案例(a)直径是距离DE。
      • 我们完成了!
    • 案例(b)圆圈C触及集合中的另一个点F.
      • 检查是否存在长度超过C周长的一半的无点弧间隔。
      • 如果没有这样的无点弧间隔退出那么 我们完成了!
    • 否则
      • 转到第4步。
      • 在这种情况下,三个点必须位于长度小于圆周一半的弧上。我们在弧上三个点的外两个上重复步骤4。

  5. 这里的另一个页面,带有一个示例applet: http://www.sunshine2k.de/stuff/Java/Welzl/Welzl.html