【问题标题】:Dynamic closest elements动态最近元素
【发布时间】:2010-12-14 09:35:02
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

  • 没有。这 50 个元素是常量。

标签: grid closest knn


【解决方案1】:

听起来您正在尝试想出一种方法,您可以在时间 t 获取 10 个最接近的点,并使用这些点来帮助您找出在时间 t+1 最接近的 10 个点。这是一个需要考虑的想法。

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

当然,要做到这一点,您需要有某种方法在网格的特定区域中进行搜索,而不是通过点数组进行线性搜索以找到靠近您的点。我建议为此研究 BSP 树。如果您还没有这样做,那么仅使用 BSP 树而不是线性搜索可能就是您正在寻找的性能提升。

【讨论】:

  • 感谢您的回答。我肯定会研究 BSP 树。我确实希望计算会更快。
【解决方案2】:

所以,我将把所有的尝试都放在我的实现上,希望你能找到最适合你项目的方法。

我正在从事与您提到的有点相似的项目。但在我的情况下,一旦我找到给定距离阈值内的点,我需要做额外的循环。我尝试了几次迭代,首先我从创建距离网格开始。请记住,我不是在 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 名成员。

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

【讨论】:

  • 感谢您的回答。我真正想做的是如何以最快的方式计算距离。我知道计算距离,但假设点在移动,我需要重新计算距离,我想快速计算。
  • 当你使用最快的方式时很难分析。但是由于您提到该点正在移动,您可能会更好地以网格表示形式表示这些点,以便您知道哪些点属于哪个网格。这意味着您必须保留网格信息。
  • 更快的方式 = 计算时间最短的方式。我有硬件限制,我需要以最快的方式进行计算。这些点在网格中表示,但是我可以获得哪些信息才能更好地计算它而不是欧几里得距离?
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 2019-03-22
  • 2023-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
相关资源
最近更新 更多