我有一大堆3d点(20,000+),分散在整个3d空间中。我需要确定哪些点在集合中每个点的特定任意范围内。例如,对于每个点,10个单位范围内的点组是什么。对此的排列非常大。那么,解决这个问题的计算效率最高的方法是什么? (我只需要使用java来解决这个问题。)
答案 0 :(得分:3)
您可以使用FIDDLE,它基本上是一个k维二叉树。 k-d树中的范围搜索非常有效。
答案 1 :(得分:2)
由于这是一个没有代码的理论问题,我会在这里投入2美分。如果您不使用像postgis(http://postgis.net/)这样的几何数据库,我会建议以下内容,前提是这些点有三个坐标(X,Y,Z)。
制作三个包含点的id和其中一个坐标的数组。按坐标对它们排序。然后对于每个点,检查最后一个和下一个是否在范围内。如果两者都没有,那就消除这一点。为每个数组做这个。然后,您将有更少的空间来计算。然后对于一个点范围内的每个点,计算距离和标志,消除最远点。
希望这会有所帮助。
答案 2 :(得分:1)
您可以使用空间填充曲线和近似值。将点视为二进制并将其交错。然后对数字进行排序并利用曲线首先访问附近的点。你可以尝试很多曲线,这很可能取决于它们。
答案 3 :(得分:1)
听起来你需要R-tree。或者像kd-tree这样的范围树,它会返回一个框中的所有点,然后你只需要在查询点所需距离处过滤所有点。
答案 4 :(得分:0)
使用预分配为完整大小的ArrayList。 (使用立方体形状区域)
make-hash-table