java - 检查任意圆是否包含给定点集的 k 个以上的点
问题描述
我有一组 n 个点和一个或多或少任意的圆。现在我想检查圆是否最多包含 k 个点。
现在我只是蛮力测试所有的点。由于我需要为很多圈子回答这个问题,因此最多 n²log(n) 的预处理时间就可以了。
最佳数据结构很可能是顺序 k-Voronoi 图(不是维度 k 的图),但我需要自己实现它,因此我想知道我是否还有其他(更简单的)选项。
另一个加快速度的想法是使用 KD-Tree。
我想知道,如果我错过了另一种方法。
解决方案
您似乎在进行固定半径近邻计数查询。
使用 KD-tree (K=2),您可以列出给定圆中的点,时间大约为 O(k + Log n)。这是通过将圆与 KD-tree 细分的矩形重叠来实现的。当一个矩形完全包含在圆中时,不需要进一步细分,矩形内的所有点都在圆内。
因此,您可以使用树的每个节点中包含的点数来增强树。这会将运行时间降低到 O(m + Log n),其中 m 是包含在圆中或被圆分割的矩形的数量。当一个矩形包含的点少于预定义的点数时,也可以停止细分,并通过蛮力测试它们。
这些是启发式的。你必须在你的案子上测试它们,看看它们是否值得。
更新:
只是一个想法,没有真正研究过:Vantage-point 树适用于 k 最近邻搜索,它们使用圆圈划分平面。这可能会更好地与圆形查询相结合。
https://en.wikipedia.org/wiki/Vantage-point_tree#Searching_through_a_vantage-point_tree
推荐阅读
- powershell - 使用 Microsoft/Google OAuth 到站点的 tokenInvoke-WebRequest
- email - DHTML URL 部分在服务器上运行时自动剖析
- javascript - 无法在 VS 代码中运行 javascript 代码
- python - 如何计算唯一行及其在熊猫中的出现次数
- flutter - 为什么 AutoCompleteTextField 在 Flutter 中没有显示任何建议?
- r - 对于数据帧中的给定组合,计算该组合在 R 中另一个数据帧中的出现频率
- android - Android 推送通知 - 适用于所有设备的应用徽章图标
- javascript - 在函数中调用 React Hook “useState”
- go - Go 中的简短声明
- python - 如何将 2 个命令放在 1 个按钮中