algorithm - 如何快速确定球体包含给定集合的多少个点?

标签 algorithm segment-tree octree

给定一组(x,y,z)形式的点,以及一组(x,y,z,半径)形式的球体。

对于每个球体,目标是计算球体内的点数。

我比较了球心和点的欧氏距离与球体半径的关系,该算法需要 O(N*M) 时间复杂度,其中 N、M 分别是点和球体的数量。

我尝试排除 (x ± r, y ± r, z ± r) 框外的点,但它根本无法缩短计算时间。

所以我研究了一些数据结构,如线段树、四叉树、八叉树和 k-d 树,但我很难将它们应用到我的目标中。

如何将时间复杂度降级为 O(NlogM)、O(MlogN) 或其他值?

最佳答案

如果坐标范围有限,可以将空间分割为相等的立方体,并将点分配给相应的立方体(单元)。

对于每个球体,您必须仅检查该球体附近的单元格(以球体中心为中心的大致大立方体)。

真正的增益取决于单元大小和点分布的正确选择。

您提到的 k-d 树 - 对于此类问题来说它似乎是一个不错的选择。

(例如 - using this approach 对于寻找紧密对的 2d 问题,对于具有相当均匀分布的 64K 点,时间增益为 11466 ms => 62 ms(相对于成对比较))

关于algorithm - 如何快速确定球体包含给定集合的多少个点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71170420/

相关文章:

algorithm - 无法解决作业(ACM-培训)

python - 线段树的最小值和最大值

c# - 如何填补八叉树行进立方体算法中不同细节级别之间的空白?

algorithm - 检查String是否有平衡括号的递归算法

algorithm - Google "Did you mean?"算法是如何工作的?

algorithm - 数组给定范围内每个不同整数的出现次数

search - kd-tree vs octree用于3d半径搜索

opengl - 大型 3D 场景流

java - 将多个字符串排序到一个元素中

c# - 连接无向图中某些节点的最短路径