Grid 动态最近元素

Grid 动态最近元素,grid,closest,knn,Grid,Closest,Knn,我有一个二维表面(网格),在不同的位置有50个元素。 我需要决定哪一个元素是离给定点最近的10个元素 此外,给定的点在不断移动,我需要对每个移动进行计算 我知道我可以计算每次运动到每个点的欧几里德距离,但我想要一种更快的方法 谢谢。因此,我将尽我所能找出我的实现方法,希望您能够找到适合您项目的最佳方法 我正在做一个和你提到的有点类似的项目。但在我的例子中,一旦我在给定的距离阈值内找到了点,我需要做额外的循环。我尝试了几次迭代,首先我创建了一个距离网格。请记住,我不是在2D曲面上工作,但我不认为将

我有一个二维表面(网格),在不同的位置有50个元素。 我需要决定哪一个元素是离给定点最近的10个元素

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

我知道我可以计算每次运动到每个点的欧几里德距离,但我想要一种更快的方法


谢谢。

因此,我将尽我所能找出我的实现方法,希望您能够找到适合您项目的最佳方法

我正在做一个和你提到的有点类似的项目。但在我的例子中,一旦我在给定的距离阈值内找到了点,我需要做额外的循环。我尝试了几次迭代,首先我创建了一个距离网格。请记住,我不是在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;
}
public double[][]距离网格(){
double[]gridSize=combineArrays(generateClusters(1,3),generateClusters(12,15));
double[][]pointsDistanceGrid=新的双精度[gridSize.length][gridSize.length];
对于(int i=0;i
正如我提到的,我没有使用它

因为我必须处理一个距离阈值,并且在找到“最近的”之前,我决定要查看离我正在查看的特定点更近的所有点,所以我实现了这个方法

/**
 * 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;
}
/**
*给定一个点,方法返回一个点在阈值限制内的数组。
*@param点
*@返回
*/
公共双[]点Swithinthreshold(双点){
double[]邻居=新的double[bigCluster.length];
对于(int i=0;i如果(距离是这样的话,我将尽我所能找出我的实现方法,希望您能够找出适合您项目的最佳方法

我正在做的项目与您提到的有些类似。但在我的情况下,一旦我在给定的距离阈值内找到点,我需要做额外的循环。我尝试了几次迭代,首先我创建了一个距离网格。请记住,我不是在二维曲面上工作,但我不认为将其更改为二维会花费很多工作。

下面是我如何开发我的距离网格(即使是穴居人也能做到,这很简单,我在取笑我自己),还要记住我没有继续使用网格来完成我的实现

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;
}
public double[][]距离网格(){
double[]gridSize=combineArrays(generateClusters(1,3),generateClusters(12,15));
double[][]pointsDistanceGrid=新的双精度[gridSize.length][gridSize.length];
对于(int i=0;i
正如我提到的,我没有使用它

因为我必须处理一个距离阈值,并且在找到“最近的”之前,我决定要查看离我正在查看的特定点更近的所有点,所以我实现了这个方法

/**
 * 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;
}
/**
*给定一个点,方法返回一个点在阈值限制内的数组。
*@param点
*@返回
*/
公共双[]点Swithinthreshold(双点){
double[]邻居=新的double[bigCluster.length];
对于(int i=0;i如果(距离<P>)听起来你在试图想出一种方法,你可以在时间t取10个最接近的点,并用这些来帮助你找出时间t + 1中最接近的10个。这里有一个要考虑的想法。

计算最近的10个点时,还要存储它们相对于当前位置的角度方向。然后,移动时,可以计算移动的方向。将搜索重点放在向您开放的空间上(想象围绕点a的一个圆圈和围绕点B的另一个圆圈。B中而非a中的空间是您希望集中搜索的地方)


当然,要做到这一点,你需要在网格的特定区域进行某种搜索,而不是通过一系列点进行线性搜索来找到你身边的点。我建议你查看BSP树。如果你还没有这样做,使用BSP树而不是线性搜索可能会单独提高性能你想尝试一种方法,你可以在时间T上取10个最接近的点,并用这些来帮助你找出时间t + 1中最接近的10个点。这里有一个要考虑的想法。

计算最近的10个点时,还要存储它们相对于当前位置的角度方向。然后,移动时,可以计算移动的方向。将搜索重点放在向您开放的空间上(想象围绕点a的一个圆圈和围绕点B的另一个圆圈。B中而非a中的空间是您希望集中搜索的地方)

当然,要做到这一点,你必须