我有一个包含n列和5行的网格。
每条边都是加权的而且是非负的。我需要从左下角开始,以最短的路径到达右上角。
我发现它的O(N ^ 2)复杂度,但我需要它在线性时间O(n)。
我会感激一些帮助。
我如何在线性时间内解决网格(n,2):
左下角是0,然后我开始通过一些比较来寻找它的邻居。在我从一开始就找到最小值之后,我会去他们的邻居并做同样的事情,我这样做直到我结束。
我对每个顶点和每个边缘进行一次删除,因此它是线性的。
提前谢谢你,
亚龙。
答案 0 :(得分:0)
在此图表中,您有5n
个顶点和5*4*n
边,因此V=5n
和E=20n
。
您可以使用priority_queue轻松应用Dijkstra来检索最小顶点,这将导致O(VlogV + ElogE)的时间复杂度,在这种情况下为O(N * logN)。
Dijkstra wiki link。它包含sudo代码。
如果您在谷歌搜索但是确保它使用priority_queue,您也可以找到它的C ++实现,否则它将花费log(N ^ 2)时间。如果你没有找到它给我发表评论,我会发给你它的实施。
答案 1 :(得分:0)
随意纠正我,但你不能在线性时间内做到这一点,或多或少不可能*
使用网格格式并不容易使用。
*不使用特殊约束