在2D平面中找到通过点的最短路径

时间:2014-08-28 15:04:04

标签: algorithm computational-geometry shortest-path

我遇到了以下问题:

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

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

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

我开发了以下算法:

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

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

1 个答案:

答案 0 :(得分:2)

正如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]

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