Algorithm 哪个更好?
我正在尝试开发一种能够从图中找到最小生成树的算法。我知道已经有很多现有的算法。但是我正在尝试消除Kruskal算法中需要的边排序。到目前为止,我开发的算法有一部分需要计算不交集,我需要一个有效的方法。经过大量研究,我知道唯一可能的方法是使用BFS或DFS,其复杂性为O(V+E),而Kruskal的算法的复杂性为O(ElogE)。现在我的问题是,O(V+E)或O(ElogE),哪一个更好?一般来说,Algorithm 哪个更好?,algorithm,time-complexity,graph-theory,breadth-first-search,kruskals-algorithm,Algorithm,Time Complexity,Graph Theory,Breadth First Search,Kruskals Algorithm,我正在尝试开发一种能够从图中找到最小生成树的算法。我知道已经有很多现有的算法。但是我正在尝试消除Kruskal算法中需要的边排序。到目前为止,我开发的算法有一部分需要计算不交集,我需要一个有效的方法。经过大量研究,我知道唯一可能的方法是使用BFS或DFS,其复杂性为O(V+E),而Kruskal的算法的复杂性为O(ElogE)。现在我的问题是,O(V+E)或O(ElogE),哪一个更好?一般来说,E=O(V^2),但对于所有图来说,这个界限可能并不严格。特别是,在稀疏图中,E=O(V),但对于算
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)
另一种看待它的方式是,在big-O表示法中,O(X+Y)
的意思与O(max(X,Y))
的意思相同
请注意,这仅在
V
和E
可能具有相同幅值时才有用。对于Kruskal的算法,主要因素是需要对边列表进行排序。无论你有一个稀疏图还是一个稠密图,这一步支配着任何可能是O(V)
,因此你只需写O(E lge)
,而不是O(V+E lge)
,V
就可以用E
来表示,使用欧拉公式。因此O(V+E)
实际上就是O(E)
。由于O(n)
,O(E+V)~=O(E)
。我不确定我的数学,所以将此作为评论而不是评论发布answer@Srini你不能假设没有循环,因为问题是关于计算一个图的最小生成树(如此无向且具有潜在的非平凡循环)。然而,假设有一棵树可以找到,我们可以安全地假设V@Rerito是一个好点,我忽略了循环方面,因为我不确定如何处理平面图的Euler公式的V-E+F=2
的F
分量。但我想,如果OP或其他人能够想出如何处理这个问题,或者证明V
仍然有一个线性关系w.r.tE
,那么我猜他们仍然可以在这个论证的基础上,并行运行这两个算法,并在一个算法完成后立即停止,这给了你复杂性O(min(V+E,E Log E))
,哪一个总是最好的。你能给我一个关于O(ElogE)的想法吗?Kruskal的算法涉及到边列表的排序,所以无论你有一个稀疏图还是稠密图,这将控制简单地迭代无序列表的成本。“加法”术语V
在这两种情况下都是不相关的,因此只写O(E lge)
而不是O(V+E lge)
。