你如何比较两种算法的时间复杂度

时间:2013-12-26 18:21:33

标签: big-o dijkstra

我正在尝试将Dijkstra算法与呼吸优先搜索算法进行比较。在查看伪代码和每个细节后,我发现复杂性是:

Dijkstra's Algorithm - O(#Vertices * log(#Vertices) + #Edges)

Breath First Search - O(#Vertices + #Edges)

我怎么知道哪个更优化?为了简化这一点,我们基本上将比较:O(n * log(n))与O(n)(如果我没有弄错的话)。但是,我仍然不确定哪个更有效率。

1 个答案:

答案 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)来研究,这意味着分母渐近支配分子。

图表情况下的复杂情况是您没有比较0f(n),但几乎总是g(n)f(E,V)所以,在您的您正在查看的案例:g(E,V)O(V+E)。幸运的是,这是一个非常简单的情况,因为除了O(V*logV + E)因素之外,两个表达式几乎相同。由于logV术语在双方都很常见,因此您实际上只是在查看上面讨论的EO(V * logV)比较。但是,如果你必须将复杂度为O(V)的算法与复杂度为O(V * logE + E)

的算法进行比较,情况就会变得更加混乱