【发布时间】:2012-06-15 15:32:40
【问题描述】:
我正在寻找一种有效的算法,对于具有已知高度、宽度和长度的空间,给定一个固定半径 R,以及一个点列表 N,在该空间中具有 3 维坐标,将找到所有点在网格上任意点的固定半径 R 内。此查询将使用不同的点进行多次,因此昂贵的预处理/排序步骤以换取快速查询可能是值得的。这是我正在处理的应用程序的一个瓶颈步骤,所以任何时候我可以切断它都是有用的
到目前为止我尝试过的事情:
-朴素算法,遍历所有点并计算距离
-将空间划分为长度为 R 的立方体的网格,并将点放入其中。这样,对于每个点,我只需要查询直接相邻的存储桶。这有显着的加速
-我尝试使用曼哈顿距离作为启发式方法。也就是说,在桶内,在计算到任何点的距离之前,使用曼哈顿距离过滤掉那些不可能在半径 R 内的(即曼哈顿距离
编辑:为了比较距离,我使用平方距离来避免使用 sqrt 函数。
显然,我能加快多少速度会有一些限制,但我现在可以使用任何建议来尝试。
这在算法层面可能并不重要,但我正在使用 C 语言工作。
【问题讨论】:
-
sqrt()是一个昂贵的函数。为了加快速度,您应该将另一边平方并进行比较。 -
我已经这样做了。将编辑问题以反映这一点,谢谢。
-
我发现问题陈述难以解析。您是否试图找到任意点的 R 内的点子集(在您称为 N 的列表中)?什么是“元素”——N 中的点?
-
这似乎是对的。我进行了编辑,以使问题中的术语更加自洽。
-
我还是不清楚。从查询到查询有什么变化?积分列表?球的中心?半径?上述所有的?您谈到预处理是为了优化多个查询,但不清楚什么是不变的。
标签: algorithm