【发布时间】:2012-07-02 23:33:38
【问题描述】:
【问题讨论】:
-
您正在寻找包围这些点的最小圆的中心。我猜想像
smallest circle这样的谷歌搜索会是一个不错的开始。
【问题讨论】:
smallest circle 这样的谷歌搜索会是一个不错的开始。
查看此页面。它描述了几种方法来做到这一点。 http://www.personal.kent.edu/~rmuhamma/Compgeometry/MyCG/CG-Applets/Center/centercli.htm
如果上面的链接失效,下面是描述最直接方法的相关部分:
O(n2) 时间算法
在这个阶段,我们是一个圆 C,它通过给定集合的两个或多个点。如果圆包含的弧的间隔(无点间隔)大于圆的周长的一半,并且没有点位于该圆弧上,则可以使圆更小。令 D 和 E 为该无点区间末端的点。在将 D 和 E 保持在圆的边界上的同时,减小圆的直径,直到出现情况 (a) 或情况 (b)。
这里的另一个页面,带有一个示例小程序: http://www.sunshine2k.de/stuff/Java/Welzl/Welzl.html
【讨论】:
你需要使用Voronoi diagram,可能是Farthest-Point Voronoi图,其中平面被划分为区域,同一区域中的点具有相同的最远点
更新
你需要先构建一个最远点voronoi图,时间为O(nlogn),并找到所有顶点(如果圆是由三个点定义的)和所有边中最小的圆的中心(如果圆由两点定义)。这种方法的总时间复杂度是 O(nlogn)
我刚看到Smallest circle problem wiki 页面,好像有一个O(n) 时间算法。如果你关心速度,你可以检查一下,否则没关系。
【讨论】: