我已经使用Cormen第3版参考文献“Introduction to Algorithms”中的伪代码实现了Dijkstra算法,用于单源最短路径问题。
我的实现是在python上使用链表来表示邻接列表表示中的图形。这意味着节点列表是链表,每个节点都有一个链表来表示每个节点的边缘。此外,我没有实现或使用任何二进制堆或fibonacci堆作为算法所需的最小优先级队列,因此当过程需要提取时,我在链接的节点列表内的O(V)时间内搜索每个节点与源距离最小的下一个节点。
另一方面,该参考文献还在将松弛程序应用于所有边缘之前使用拓扑排序提供了DAG(我已实现)的算法。
在所有这些背景下,我有一个复杂度为
的Dijkstra算法0(V ^ 2)
具有复杂度
的DAG最短路径算法O(V + E)
通过使用timeit.default_timer()
函数来计算算法的运行时间,我发现Dijkstra算法在应用于具有正边缘权重和不同图形密度的DAG时比DAG算法更快,全部为100和1000个节点。
对于DAG,DAG最短路径算法不应该比Dijkstra快吗?
答案 0 :(得分:1)
您对这两种算法的运行时间分析都是正确的,并且DAG最短路径算法确实比Dijkstra的DAG算法更快。
但是,您的测试结果可能有3个原因:
用于测试的图形非常密集。当图非常密集时,E≈V ^ 2,因此两种算法的运行时间都接近O(V ^ 2)。
顶点数仍然不够大。为了解决这个问题,您可以使用更大的图形进行进一步测试。
DAG的初始化需要大量的运行时间。
无论如何,DAG最短路径算法理论上应该比Dijkstra算法更快。