【问题标题】:Given a set of coordinates, find the max distance (using steps)给定一组坐标,找到最大距离(使用步骤)
【发布时间】:2016-12-10 13:33:36
【问题描述】:

给定一组代表飞行路径的坐标,练习是找到最大距离(给定 n 个要通过的点)。为了说明问题,我们在 2D 网格上表示了一条飞行路径,如下所示:

.

下面是算法应该对参数 n(整数)执行的操作。

问题是找到一种算法,可以扫描所有点并尝试通过组合所有距离并返回最终路径的长度。

我们已经有了一个可以得到两点距离的方法:

 /**
 * @return the distance between the two coordinates
 */
public double distance(Coordinate destination) {}

 /**
 * @return the farthest coordinate from start
 */
public Coordinate coordMax() {}

 /** 
 * @return max distance using n points
 * I would maybe try to go for a recursive solution 
 * and already have the 2 corner cases down.
 */
public double statMaxDistance(int n) {

    if (n == 0)
        return coordTable[0].distance(coordTable[coordTable.length - 1]);
    if (n == 1)
        return coordTable[0].distance(coordMax());

    // TODO recursive step

    return statMaxDistance();
}

问题是:

有没有一种方法可以完成这项任务,而无需逐个迭代整个路径的每个点,尝试所有可能的组合,计算所有可能的距离以最终得到最远的距离?

遵循这样一种方法似乎相当合理,其中只有 1 或 2 个点会沿着整个路径移动,但在计算给定 3 个以上参考点的最大距离时,这种算法会非常贪婪。

【问题讨论】:

    标签: java algorithm optimization path coordinates


    【解决方案1】:

    这可以使用动态程序来解决。假设D[i][j] 是从起点到i-th 中间点的最大距离,其中最后一点是j。您的解决方案将是D[n][endPoint]

    那么如何解决呢?第一列D[0][...] 很容易计算。这将只是相应点到起点的距离。其他列有点棘手。您需要检查上一列中最后一个点严格在当前点之前的所有条目。所以,要计算条目D[i][j],你必须计算:

    D[i][j] = max_{k < j} (D[i - 1][k] + distance(k, j))
    

    这意味着:迭代所有可能的k 使得k 小于j(即点k 位于当前点j 之前)。将结果距离计算为直到k(这是D[i - 1][k] 部分)的距离与从kj 的距离之和。将这些值中的最大值放入D[i][j]。如果您需要在最后重建路径(即您不仅对最大距离感兴趣),您可能还想跟踪k。请注意,可能存在没有有效解决方案的单元格(例如 D[1][0] - 您无法将 0 指向第二个(索引 1)中间点)。

    对每列中的每个中间点执行此操作,直到 D[n - 1][...]。最后一步是对D[n][endPoint] 再次执行此过程,严格来说它不需要位于D 数组中(因为您只对单个值感兴趣,而不是整个列)。

    一旦你计算出这个值,这就是你的解决方案。如果要找到实际路径,则必须使用存储的每个单元格的 k 值进行回溯。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多