【问题标题】:Placing a point to minimise distance from the farthest point放置一个点以最小化与最远点的距离
【发布时间】:2012-07-02 23:33:38
【问题描述】:

我有一个问题,

给定一组点,如何在距离最远点的距离尽可能小的约束下放置一个点?

这是参考this问题。我不知道该怎么做。有人指点吗?

谢谢

【问题讨论】:

  • 您正在寻找包围这些点的最小圆的中心。我猜想像smallest circle 这样的谷歌搜索会是一个不错的开始。

标签: algorithm math geometry


【解决方案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 周长一半的无点圆弧区间。
      • 如果没有这样的无点弧间隔退出 THEN 我们完成了!
    • 其他
      • 转到第 4 步。
      • 在这种情况下,三个点必须位于长度小于圆周一半的弧上。我们在弧上三个点中的外部两个重复第 4 步。


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

【讨论】:

    【解决方案2】:

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

    更新

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

    我刚看到Smallest circle problem wiki 页面,好像有一个O(n) 时间算法。如果你关心速度,你可以检查一下,否则没关系。

    【讨论】:

    • 如果你熟悉这些,你能详细说明一下吗?如何为其制定算法?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 2015-10-16
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多