Algorithm 克鲁斯卡尔的复杂性';s算法

Algorithm 克鲁斯卡尔的复杂性';s算法,algorithm,time-complexity,kruskals-algorithm,Algorithm,Time Complexity,Kruskals Algorithm,我试图找出Kruskal不相交集决定循环的复杂性 在Kruskal的中,我们将顶点添加到不相交集中,并创建这些集的并集,如果我们添加了一条边,就我而言,它在不同的集中具有两个顶点。这就是我们确定循环的方法——如果两个顶点已经在一个集合中,我们不添加此边 我们如何检查顶点是否在集合中?在我看来,它是在O(n)中,因此Kruskal将至少在O(n^2)+边排序时间O(nlogn) 例如,在这里,这也是我的问题,他们说当您只有两种类型的边时,可以在O(V+E)中运行Kruskal。我明白了,但我不明白

我试图找出Kruskal不相交集决定循环的复杂性

在Kruskal的中,我们将顶点添加到不相交集中,并创建这些集的并集,如果我们添加了一条边,就我而言,它在不同的集中具有两个顶点。这就是我们确定循环的方法——如果两个顶点已经在一个集合中,我们不添加此边

我们如何检查顶点是否在集合中?在我看来,它是在
O(n)
中,因此
Kruskal
将至少在
O(n^2)
+边排序时间
O(nlogn)


例如,在这里,这也是我的问题,他们说当您只有两种类型的边时,可以在
O(V+E)
中运行Kruskal。我明白了,但我不明白不相交集的问题,我认为它会造成更大的复杂性。

你可以通过检查

对于任何操作,不相交集的时间复杂度最多为O(α(n))。这里是α,对于您或任何其他人将使用的任何输入,它都小于5

一个不相交的集合就像一个由树结构组成的森林。树的根唯一地标识一个集合。不相交集通过确保当两个集连接时,它们总是连接在一起,从而使到根的路径尽可能短,从而实现其黑魔法。此外,每当对集合执行集合成员身份检查时,它都会折叠根路径上的每个节点,以便这些节点现在可以在O(1)时间内检查其成员身份


结果是Kruskal的算法在集合的每个操作上花费了O(α(n))时间,实际上,这与不花费时间是一样的。

你试过了吗?是的,当然。我对不相交集有一个问题。如果你通过谷歌搜索维基百科的链接,文章中会有一个指向不相交集数据结构的链接。请阅读那篇文章。问题是,你的问题目前很模糊。可以简单地实现不相交集,那么将两个集合并将是O(n)。可以使用上述数据结构,并获得与复杂度一样低的n的逆阿克曼函数。甚至有可能实现比O(n)更差的性能。你没有指定你正在谈论的不相交集实现,所以我们无法猜测你的复杂性。事实上,我的问题是我在计算Kruskal算法的时间复杂性,其中边来自{1,2}。这意味着我们可以在线性时间内对它们进行排序。我已经读到,在这个例子中,Kruskal的复杂度可以是O(| E |+| V |),我没有得到,因为E用于排序边,V应该是添加边的时间。如果我是对的,那么所有的周期检查都应该是线性时间。所以这就是为什么我对不相交集感兴趣。“没有时间”->“恒定时间”。