繁体   English   中英

从大型数据集计算附近点的最快方法是什么

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM