![](/img/trans.png)
[英]What is the fastest way to write a large amount of data from memory to a file?
[英]What is the fastest way to calculate nearby points from large data set of points
我有一大堆3d点(20,000+),分散在整个3d空间中。 我需要确定哪些点在集合中每个点的特定任意范围内。 例如,对于每个点,10个单位范围内的点组是什么。 对此的排列非常大。 那么,解决这个问题的计算效率最高的方法是什么? (我需要使用java来解决这个问题。)
您可以使用kd树 ,它基本上是一个k维二叉树。 kd树中的范围搜索非常有效。
既然这是一个没有代码的理论问题,我会在这里抛出2美分。 如果您不使用像postgis( http://postgis.net/ )这样的任何几何数据库,我将建议以下内容,前提是这些点有三个坐标(X,Y,Z)。
制作三个包含点的id和一个坐标的Arrays。 按坐标对它们排序。 然后对于每个点,检查最后一个和下一个是否在范围内。 如果两者都没有,那就消除这一点。 为每个数组做这个。 然后,您将有更少的空间来计算。 然后对于一个点到达范围内的每个点,计算距离和标志,消除最远点。
希望这会有所帮助。
您可以使用空间填充曲线和近似值。 将点视为二进制并将其交错。 然后对数字进行排序并利用曲线首先访问附近的点。 你可以尝试很多曲线,这很可能取决于积分。
听起来你需要一个R树 。 或者像kd-tree这样的范围树,它会返回一个框中的所有点,然后你只需要在查询点所需距离处过滤所有点。
使用预分配为完整大小的ArrayList。 (使用立方体形状区域)
public class Point3D {
public int x, y, z;
public static List<Point3D> allWithinRange(List<Point3D> possiblePoints, int x, int y, int z, int inter) {
List<Point3D> list = new ArrayList<Point3D>(possiblePoints.size());
possiblePoints.stream()
.filter(it -> it.x <= x + inter && it.x >= x - inter)
.filter(it -> it.y <= y + inter && it.y >= y - inter)
.filter(it -> it.z <= z + inter && it.z >= z - inter)
.forEach(list::add);
return list;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.