【问题标题】:Find shortest path through points in 2D plane找到通过二维平面中点的最短路径
【发布时间】:2014-08-28 15:04:04
【问题描述】:

我有以下问题:

给定平面上的点集 P = { (x1, y1), (x2, y2), ..., (xn, yn) },找到具有以下性质的最短路径:

  • 从P中最左边的点L开始(x坐标最小)
  • 它通过x坐标增加的点到达最右边的点R(x坐标最大)
  • 然后它通过 x 坐标递减的点从 R 回到 L
  • 它访问来自 P 的所有点
  • 我们可以假设所有点都有不同的 x 坐标。

  • 另外我假设每个点只能访问一次(但我不确定它是否不符合上述属性)。

我开发了以下算法:

1. sort points in P by the x coordinate
2. start two paths in the left most point L
3. for each p in P:
4.     extend path that has last point closest to p
5. connect shorter path with R with edge X

但事实证明这是错误的。路径可以相交,当它们相交时,总会有更好的路径,可以通过切换相交段的端点来构建。如何解决?

【问题讨论】:

  • 即,您想找到一个最小长度bitonic tour。维基百科建议这在 CLRS 中作为一个练习出现,这与我的记忆相吻合。

标签: algorithm computational-geometry shortest-path


【解决方案1】:

正如 David Eisenstat 所提到的,您需要覆盖每个点的最短双音之旅。

这可以通过 O(n^2) 时间内的动态规划来完成。

Pij (1 <= i <= j <= n) 是从点pipj 的双调路径,这样路径从pi 开始,严格向左到p1,然后严格向右到pj,在此过程中覆盖pj左侧的所有点。

d[i,j] 是从ij 的最短路径的长度。

Note that d[1,2] = dist(p1,p2)
d[1,3] = d[1,2] + dist(p2,p3).
d[i,j] = d[i,j-1] + dist(j-1,j) for i < j-1.
d[j-1,j] = min( d[k,j-1] + dist(k,j) ) for 1 <= k < j-1

你可以使用上面的递归关系找到d[n,n]

构建这个二维矩阵需要 O(n^2) 时间

【讨论】:

  • 用 O(n) 空间是可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-02
相关资源
最近更新 更多