Java 检查任意圆是否包含给定点集的k个以上点

Java 检查任意圆是否包含给定点集的k个以上点,java,computational-geometry,Java,Computational Geometry,我有一组n个点和一个或多或少任意的圆。 现在我想检查圆是否最多包含k个点 现在我只是用蛮力测试所有的点。因为我需要回答很多圈的问题,所以预处理时间高达n²log(n)就可以了 最佳的数据结构很可能是顺序k-Voronoi图(不是维度k的图),但我需要自己实现它,因此我想知道是否还有其他(更简单的)选项 另一种提高速度的方法是使用KD树 我想知道,我是否错过了另一种方法。似乎您正在寻找固定半径的近邻计数查询 使用KD树(K=2),可以列出给定圆中的点,时间大约为O(K+logn)。这是通过将圆与K

我有一组n个点和一个或多或少任意的圆。 现在我想检查圆是否最多包含k个点

现在我只是用蛮力测试所有的点。因为我需要回答很多圈的问题,所以预处理时间高达n²log(n)就可以了

最佳的数据结构很可能是顺序k-Voronoi图(不是维度k的图),但我需要自己实现它,因此我想知道是否还有其他(更简单的)选项

另一种提高速度的方法是使用KD树


我想知道,我是否错过了另一种方法。

似乎您正在寻找固定半径的近邻计数查询

使用KD树(K=2),可以列出给定圆中的点,时间大约为O(K+logn)。这是通过将圆与KD树细分的矩形重叠来实现的。当矩形完全包含在圆中时,无需进一步细分,矩形内的所有点都在圆内

因此,您可以使用树的每个节点中包含的点数来增强树。这将使运行时间降低到O(m+对数n),其中m是包含在圆中或被圆分割的矩形数。当矩形包含的点少于预定义数量时,也可以停止细分,并使用蛮力进行测试

这些都是启发法。你必须在你的案例中测试它们,看看它们是否值得


更新:

只是一个想法,并没有真正研究:有利点树适合于k近邻搜索,它们使用圆划分平面。这可能更好地与循环查询相结合


是的,这就是我所说的暴力强迫。但大多数情况下,圆应该很小,因此检查所有的点并没有真正意义,我的问题更多:我如何决定首先测试哪些点(或者根本不测试),如果使用树形图包含圆的所有半径作为键会怎么样?然后,您可以使用
floor
ceiling
检索最近的半径,并更新该半径的值(可能是一个计数)。这可能要求圆同心。您允许在什么时间进行查询?