【发布时间】:2010-12-23 06:28:09
【问题描述】:
给定平面上的一组 n 个点,我想以某种方式比 O(n^2) 更快地预处理这些点(最好是 O(nlog(n))),然后能够回答以下类型的查询“有多少 n 个点位于具有给定中心和半径的圆内?”比 O(n) 快(最好是 O(log(n))。
你能推荐一些我可以用来解决这个问题的数据结构或算法吗?
我知道这类问题通常可以使用 Voronoi 图来解决,但我不知道如何在这里应用它。
【问题讨论】:
-
在预期的情况下你可能会做得很好,但如果你在 O(n) 下得到最坏情况下的查询性能,我会感到惊讶。我想到的最坏情况是很多点非常接近给定的圆。
-
@Jason,在这种情况下,所需的复杂度为 O(logn + k),其中 k 是圆内的点数。这实际上是计算几何课程中常见的家庭作业:)
-
沿着 Voronoi 图的线,如果你画出所有点之间的垂直平分线,即 O(n^2),并确定你所做的所有区域(也是 O(n^2 ),根据research.att.com/~njas/sequences/A000124),那么每个区域中的所有点都按照距离的顺序共享相同的点序列,对吧?因此,对于每个区域,制作一个数据结构来解决该区域内的问题。这将使阶段 2 O(log n)。但在第 1 阶段,这是一个荒谬的工作量,我猜是 O(n^3 log n)。
-
@Anna,呵呵,这大大改变了问题。
-
@Anna 你能说一下你提到的常见家庭作业的常见解决方案是什么。虽然我需要比 O(k) 更快的算法,但它仍然很有用。
标签: algorithm math search geometry range