我正在尝试将Dijkstra算法与呼吸优先搜索算法进行比较。在查看伪代码和每个细节后,我发现复杂性是:
Dijkstra's Algorithm - O(#Vertices * log(#Vertices) + #Edges)
Breath First Search - O(#Vertices + #Edges)
我怎么知道哪个更优化?为了简化这一点,我们基本上将比较:O(n * log(n))与O(n)(如果我没有弄错的话)。但是,我仍然不确定哪个更有效率。
答案 0 :(得分:0)
在对图算法进行Big-O分析时,通常将边数和顶点数作为相关变量包含在表达式中是有意义的,除非您知道图形的数量是顶点的数量占主导地位的数字边缘(或反之亦然)。所以通常你不想说具有大{O}复杂度O(E+V)
的算法可以减少到O(n)
(再次,除非E>>> V或V>> ; E)。
如上所述,正如其他人在评论中所指出的那样,如果图表是加权的,那么Djikstra的算法会做出与广度优先搜索算法不同的事情,因此在应用于未加权图表时只比较它们是有意义的。
此外,评论中指出O(n)
支配 O(n*logn)
的{{1}}大值。这意味着当n
变大时,n
将始终大于n*logn
。这可以通过将极限当n接近n
的无穷大并观察极限为n / (n*logn)
来研究,这意味着分母渐近支配分子。
图表情况下的复杂情况是您没有比较0
和f(n)
,但几乎总是g(n)
和f(E,V)
所以,在您的您正在查看的案例:g(E,V)
和O(V+E)
。幸运的是,这是一个非常简单的情况,因为除了O(V*logV + E)
因素之外,两个表达式几乎相同。由于logV
术语在双方都很常见,因此您实际上只是在查看上面讨论的E
与O(V * logV)
比较。但是,如果你必须将复杂度为O(V)
的算法与复杂度为O(V * logE + E)