我正在寻找一种有效的算法,对于具有已知高度、宽度和长度的空间,给定一个固定的半径 R,以及一个点列表 N,在该空间中具有 3 维坐标,将找到固定范围内的所有点网格上任意点的半径 R。此查询将使用不同的点多次完成,因此昂贵的预处理/排序步骤以换取快速查询可能是值得的。这是我正在处理的应用程序的一个瓶颈步骤,所以任何时候我可以切断它都是有用的
到目前为止我尝试过的事情:
- 朴素算法,遍历所有点并计算距离
- 将空间划分为长度为 R 的立方体的网格,并将点放入其中。这样,对于每个点,我只需要查询直接相邻的存储桶。这有显着的加速
-我尝试使用曼哈顿距离作为启发式方法。也就是说,在桶内,在计算到任何点的距离之前,使用曼哈顿距离过滤掉那些不可能在半径 R 内的(即曼哈顿距离 <= sqrt(3)*R 的那些) )。我认为这会提供加速,因为它只需要加法而不是乘法,但它实际上使程序减慢了一点
编辑:为了比较距离,我使用平方距离来消除必须使用 sqrt 函数。
显然,我可以加快多少速度会有一些限制,但我可以使用任何关于现在尝试的事情的建议。
并不是说它在算法层面上可能很重要,但我正在使用 C 语言工作。