空圈查询算法

时间:2012-06-08 02:59:07

标签: algorithm geometry voronoi

我正在尝试提出一种能够执行以下操作的算法:

如果给出了一组点,则在查询点中找到最大的圆圈(以查询点为中心),该圆圈不包含该集合中的任何点。

到目前为止,我已经考虑使用Voronoi图来查找包含最接近集合的站点点的点的区域(单元格),然后使用来自Voronoi的边缘列表来构造梯形分解。通过分解,我将能够找到查询点所在的单元格,然后圆的半径将是从查询点到该单元格的点(站点)的距离。我认为创建这样的东西所需的存储是线性的,因为Voronoi需要O(n)存储,并且从Voronoi创建梯形分解也可以通过O(n)存储来完成。

* 编辑:查询时间必须为O(logn),这意味着我无法一次遍历集合中的所有点。

这听起来不对,还是我在这里遗漏了什么?

另外,如果有人有关于此算法的一些参考资料,请告诉我。谢谢:))

2 个答案:

答案 0 :(得分:3)

这个问题似乎要求查询点到集合中距离它最近的点的距离,因此回答它的一种方法是找到最近的点。这样做的一个合理标准方法是使用http://en.wikipedia.org/wiki/K-d_treehttp://en.wikipedia.org/wiki/Nearest_neighbour_search

中涵盖了这个问题。

答案 1 :(得分:0)

听起来过于复杂。我甚至不知道Voroni图是什么,但是假设你的点都在2D平面上(这似乎是因为你提到一个圆而不是一个球体),这是非常简单的:

遍历所有点并找到最接近查询点的点。这个距离只是毕达哥拉斯定理sqrt((point_x - query_x)^2 + (point_y - query_y)^2)。最小距离是圆的半径。