Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于三维空间距离计算的Java库_Java - Fatal编程技术网

用于三维空间距离计算的Java库

用于三维空间距离计算的Java库,java,Java,给定三维空间中的一大组点(x、y、z坐标),需要找到距原点最近的十个点。 指向已经可用的java标准库的任何指针。 还感谢您对使用最佳数据结构和排序算法以节省时间和空间的方式实现解决方案的意见? 提前感谢。只需为每个值和排序计算sqrt(x^2+y^2+z^2)。在这里,我缓存了结果以提高效率 // generate Set<Point3D> points = new HashSet<Point3D>(); for (int i = 0; i < 20; i

给定三维空间中的一大组点(x、y、z坐标),需要找到距原点最近的十个点。 指向已经可用的java标准库的任何指针。 还感谢您对使用最佳数据结构和排序算法以节省时间和空间的方式实现解决方案的意见? 提前感谢。

只需为每个值和排序计算sqrt(x^2+y^2+z^2)。在这里,我缓存了结果以提高效率

// generate    
Set<Point3D> points = new HashSet<Point3D>();
for (int i = 0; i < 20; i++) {
    points.add(new Point3D(-5d + 10d * Math.random(), -5d + 10d
            * Math.random(), -5d + 10d * Math.random()));
}

// distances
final Map<Point3D, Double> distanceCache = new IdentityHashMap<Point3D, Double>();
for (Point3D point : points) {
    distanceCache.put(
            point,
            Math.sqrt(point.getX() * point.getX() + point.getY()
                    * point.getY() + point.getZ() * point.getZ()));
}

// sort
List<Point3D> tmp = new ArrayList<Point3D>(points);
Collections.sort(tmp, new Comparator<Point3D>() {
    @Override
    public int compare(Point3D o1, Point3D o2) {
        return Double.compare(distanceCache.get(o2),
                distanceCache.get(o1));
    }
});

// print results
System.out.println(tmp.subList(0, 10));
for (Point3D point : tmp.subList(0, 10)) {
    System.out.printf("%.2f,", distanceCache.get(point));
}
只需为每个值和排序计算sqrt(x^2+y^2+z^2)。在这里,我缓存了结果以提高效率

// generate    
Set<Point3D> points = new HashSet<Point3D>();
for (int i = 0; i < 20; i++) {
    points.add(new Point3D(-5d + 10d * Math.random(), -5d + 10d
            * Math.random(), -5d + 10d * Math.random()));
}

// distances
final Map<Point3D, Double> distanceCache = new IdentityHashMap<Point3D, Double>();
for (Point3D point : points) {
    distanceCache.put(
            point,
            Math.sqrt(point.getX() * point.getX() + point.getY()
                    * point.getY() + point.getZ() * point.getZ()));
}

// sort
List<Point3D> tmp = new ArrayList<Point3D>(points);
Collections.sort(tmp, new Comparator<Point3D>() {
    @Override
    public int compare(Point3D o1, Point3D o2) {
        return Double.compare(distanceCache.get(o2),
                distanceCache.get(o1));
    }
});

// print results
System.out.println(tmp.subList(0, 10));
for (Point3D point : tmp.subList(0, 10)) {
    System.out.printf("%.2f,", distanceCache.get(point));
}

Adam已经提供了一个良好且健壮的通用解决方案。不过,您可以在特定情况下使用一些可能的优化。然而,它在很大程度上取决于您定义为一组大的点。如果我们谈论的是成千上万的观点,那么请继续阅读

首先,在使用欧几里得距离时,重要的是要记住,比较平方距离将给出与实际距离之间比较相同的顺序。因此,您不必执行相对昂贵的平方根操作。直接比较
x*x+y*y+z*z

其次,最好的通用排序算法在
O(n*logn)
时间内工作。这适用于例如合并排序、堆排序和快速排序。然而,如果你有一个大的点集,你只想找到k个第一点,其中k是小的,那么有时候选择一个不同的算法是可行的。特别是当您只找到这些元素时,就可以中止排序。例如,即使进行线性O(n)搜索以查找每个元素并执行k次,也会产生O(k*n)的复杂性。如果k小于logn,则此方法将更有效。请注意,这只是一个简单的例子。也可能是查找k个第一元素的合理选择


你还应该考虑是否要建立一次点集,然后多次运行该算法,只需在每次运行之间添加/删除/移动几个点,那么维护一个保持有序的数据结构,然后从中取出第一个k个元素可能会更有效率。这可以像按平方距离排序的

树集一样简单。或者,值得在一个或一些其他3D空间分区数据结构中维护这些点。这样,您可以只查看八叉树中最靠近原点的节点

Adam已经提供了一个良好而健壮的通用解决方案。不过,您可以在特定情况下使用一些可能的优化。然而,它在很大程度上取决于您定义为一组大的点。如果我们谈论的是成千上万的观点,那么请继续阅读

首先,在使用欧几里得距离时,重要的是要记住,比较平方距离将给出与实际距离之间比较相同的顺序。因此,您不必执行相对昂贵的平方根操作。直接比较
x*x+y*y+z*z

其次,最好的通用排序算法在
O(n*logn)
时间内工作。这适用于例如合并排序、堆排序和快速排序。然而,如果你有一个大的点集,你只想找到k个第一点,其中k是小的,那么有时候选择一个不同的算法是可行的。特别是当您只找到这些元素时,就可以中止排序。例如,即使进行线性O(n)搜索以查找每个元素并执行k次,也会产生O(k*n)的复杂性。如果k小于logn,则此方法将更有效。请注意,这只是一个简单的例子。也可能是查找k个第一元素的合理选择

你还应该考虑是否要建立一次点集,然后多次运行该算法,只需在每次运行之间添加/删除/移动几个点,那么维护一个保持有序的数据结构,然后从中取出第一个k个元素可能会更有效率。这可以像按平方距离排序的

树集一样简单。或者,值得在一个或一些其他3D空间分区数据结构中维护这些点。这样,您可以只查看八叉树中最靠近原点的节点