O(V+E) 和 O(ElogE) 哪个更好?
Which one is better O(V+E) or O(ElogE)?
我正在尝试开发一种算法,该算法能够从 graph.I 中找到最小生成树知道已经有很多现有的算法 it.However 我正在尝试消除边的排序到目前为止,我开发的 Kruskal Algorithm.The 算法中的 required 有一部分需要对不相交的集合进行计数,我需要一种有效的方法来 it.After 大量研究我才知道唯一可能的方法是使用复杂度为 O(V+E) 的 BFS 或 DFS,而 Kruskal 算法的复杂度为 O(ElogE)。现在我的问题是 O(V+E) 还是 O(ElogE) 哪个更好?
一般来说,E = O(V^2)
,但对于所有图形来说,这个界限可能并不严格。特别是,在稀疏图中,E = O(V)
,但对于算法复杂性通常表示为最坏情况值。
O(V + E)
是一种表示复杂度取决于边数的方法。在稀疏图中,O(V + E) = O(V + V) = O(V)
,而在密集图中,O(V + E) = O(V + V^2) = O(V^2)
.
另一种看待它的方式是,在大 O 表示法中,O(X + Y)
与 O(max(X, Y))
的意思相同。
请注意,这仅在 V
和 E
可能具有相同量级时才有用。对于 Kruskal 算法,主要因素是您需要对边列表进行排序。无论你有一个稀疏图还是一个密集图,这一步支配任何可能是 O(V)
的东西,所以只需写 O(E lg E)
而不是 O(V + E lg E)
.
我正在尝试开发一种算法,该算法能够从 graph.I 中找到最小生成树知道已经有很多现有的算法 it.However 我正在尝试消除边的排序到目前为止,我开发的 Kruskal Algorithm.The 算法中的 required 有一部分需要对不相交的集合进行计数,我需要一种有效的方法来 it.After 大量研究我才知道唯一可能的方法是使用复杂度为 O(V+E) 的 BFS 或 DFS,而 Kruskal 算法的复杂度为 O(ElogE)。现在我的问题是 O(V+E) 还是 O(ElogE) 哪个更好?
一般来说,E = O(V^2)
,但对于所有图形来说,这个界限可能并不严格。特别是,在稀疏图中,E = O(V)
,但对于算法复杂性通常表示为最坏情况值。
O(V + E)
是一种表示复杂度取决于边数的方法。在稀疏图中,O(V + E) = O(V + V) = O(V)
,而在密集图中,O(V + E) = O(V + V^2) = O(V^2)
.
另一种看待它的方式是,在大 O 表示法中,O(X + Y)
与 O(max(X, Y))
的意思相同。
请注意,这仅在 V
和 E
可能具有相同量级时才有用。对于 Kruskal 算法,主要因素是您需要对边列表进行排序。无论你有一个稀疏图还是一个密集图,这一步支配任何可能是 O(V)
的东西,所以只需写 O(E lg E)
而不是 O(V + E lg E)
.