非负加权网格中从单个源到单个目的地的最短路径 (n,5)
Posted
技术标签:
【中文标题】非负加权网格中从单个源到单个目的地的最短路径 (n,5)【英文标题】:shortest path from single source to single destination in a non-negative weighted grid (n,5) 【发布时间】:2014-06-05 15:26:13 【问题描述】:我有一个 n 列 5 行的网格。
每条边都是加权且非负的。我需要从左下角开始,以最短的路径到达右上角。
我发现它的复杂度为 O(N^2),但我需要它的线性时间为 O(n)。
我将不胜感激。
我如何在线性时间内解决网格 (n,2):
左下角是0,然后我开始通过一些比较来寻找它的邻居。在我从一开始就找到他们的最小值后,我去他们的邻居那里做同样的事情,直到我走到最后。
我对每个顶点和每条边进行一次德尔特,因此它是线性的。
提前谢谢你,
亚龙。
【问题讨论】:
您可以使用 Dijkstra 的最短路径算法。但它使用堆数据结构在 O(NlogN) 时间内运行。 生成的路径 (c1,c2,...,cm) 是否可能包含所有网格单元?或者这是统一成本搜索? 【参考方案1】:在此图中,您有5n
顶点和5*4*n
边,所以V=5n
和E=20n
。
您可以使用 priority_queue 轻松应用 Dijkstra 来检索最小顶点,这将导致 O(VlogV + ElogE) 的时间复杂度,在这种情况下为 O(N*logN)。
Dijkstra wiki link.它包含sudo代码。
如果您在 google 中搜索,您也可以找到它的 C++ 实现,但请确保它使用 priority_queue,否则将花费 log(N^2) 时间。如果您没有找到它,请给我留言,我会将其发送给您。
【讨论】:
谢谢。问题是 dijkstra 算法适用于任何非负加权图,这里我有一个网格(平面图),我想使用网格的属性来降低复杂度。 我正在使用您的网格属性,将顶点的最大边数设为 4,这会导致时间复杂度,我认为 O(NlogN) 将满足您的需求,因为它是只比 O(N) 高一点。 但 dijkstra 无论如何都是 O(NlogN),即使图形不是网格。我正在为 (n,5) 网格寻找独特的东西。 @user76508 图表就是图表,无论您如何表示它。 如果您有一个网格 (n,2),则可以在线性时间内求解。我正在尝试对 (n,5) 做同样的事情。【参考方案2】:请随时纠正我,但你不能在线性时间内做到,这或多或少是不可能的*
使用网格格式并不容易使用。
*不使用特殊约束
【讨论】:
我在线性时间内成功地解决了网格 (n,2),这就是为什么我相信网格 (n,5) 在线性时间内是可能的。 因为在 (n,2) 中你可能并没有真正在线性时间内做到这一点,所以你在 N=2 的 O(M*N) 中做到了。如果您发布您的算法,我们可以进行更多讨论 我发布了我的网格 (n,2) 算法。 讨厌打破它,如果你使用无向加权图你没有线性地做它。假设您只处理了每个边和顶点一次(您不应该这样做,我认为您不这样做),当 E V) 中完成了它。上面发布的算法优于 O(E V)。此外,您没有只处理每个边和顶点一次,因为您应该处理中间边两次,每个邻居一次。 没有中间边缘 - 有顶部边缘和底部边缘。以上是关于非负加权网格中从单个源到单个目的地的最短路径 (n,5)的主要内容,如果未能解决你的问题,请参考以下文章