动态最近的元素

时间:2009-11-08 16:23:09

标签: grid closest knn

我有一个2D表面(网格),在不同的位置有50个元素。 我需要确定哪一个是给定点的10个最接近的元素。

此外,给定的点不断移动,我需要对每个动作进行计算。

我知道我可以计算每次运动中每个点的欧几里德距离,但我想要更快的方式。

感谢。

2 个答案:

答案 0 :(得分:1)

听起来你正试图找到一种方法,你可以在时间t取10个最近的点,并用它们来帮助你找出时间t + 1最近的10点。这是一个值得考虑的想法。

计算10个最近点时,还要存储它们相对于当前位置的角度方向。然后,当您移动时,您可以计算移动的方向。将搜索重点放在打开的空间上(想想A点周围的圆圈和B点周围的圆圈.B中的空格但A中的空间是您想要搜索的焦点。)

当然,要做到这一点,你需要有一些方法在网格的特定区域进行搜索,而不是通过一系列点进行线性搜索,以找到靠近你的那些。我建议你研究一下BSP树。如果你还没有这样做,使用BSP树而不是线性搜索可能只是你正在寻找的性能提升。

答案 1 :(得分:0)

所以,我将把我所做的所有尝试都计算出我的实现,并希望你能够找到适合你项目的最佳方法。

我正在处理与你提到的有些类似的项目。但在我的情况下,一旦我发现给定距离阈值内的点,我需要做额外的周期。我尝试了几次迭代,首先我开始创建一个距离网格。请记住,我不是在2D表面上工作,但我不认为将其更改为2D会花费很多工作。

以下是我如何开发我的距离网格(即使是洞穴人也可以这么简单,我取笑自己),同时请记住,我没有继续使用网格来完成我的实施。

public double[][] distanceGrid() {
    double[] gridSize = combineArrays(generateClusters(1, 3), generateClusters(12, 15));
    double [][] pointsDistanceGrid = new double[gridSize.length][gridSize.length];
    for (int i = 0; i < pointsDistanceGrid.length; i++) {
        for (int j = 0; j < pointsDistanceGrid[i].length; j++) {
            pointsDistanceGrid[i][j] = Math.abs(gridSize[i] - gridSize[j] );
            System.out.print(" " + pointsDistanceGrid[i][j]);
        }
        System.out.println("");
    }

    return pointsDistanceGrid;
}

正如我所提到的,我没有使用它。

由于我必须处理距离阈值,我在找到“最近的”之前就决定了我想看到更接近我所看到的特定点的所有点,所以我实现了这个方法。

/**
 * Given a point method returns an array with point that are within the limit of threshold.
 * @param point
 * @return
 */
public double[] pointsWithinThreshold(double point) {
    double[] neighbors = new double[bigCluster.length];
    for (int i = 0; i < bigCluster.length; i++) {
        if (bigCluster[i] != point) {
            double distance = 0;
            distance = Math.abs(point - bigCluster[i]);
            if (distance <= getDistanceThreshold()) {
                neighbors[i] = bigCluster[i];
            }
        }
    }
    return neighbors;
}

在此之后,我意识到我并不在乎所有最接近的点是什么,所以我最终没有使用它并将一些这样的功能折射到我得到最接近的成员并执行递归DFS的方法。

如果你想看到,请告诉我,我没有把它放在这里因为我认为你只需要知道最近的10个成员。

希望这会有所帮助并祝你好运。