Kruskal算法的复杂性

时间:2016-05-12 07:35:20

标签: algorithm time-complexity kruskals-algorithm

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

Kruskal's中,我们将顶点添加到disjoint sets并创建这些集合的联合,如果我们添加一个边缘,其中两个顶点都在不同的集合中,就我而言。这就是我们如何确定循环 - 如果两个顶点已经在一个集合中,我们就不会添加这个边缘。

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

例如SO Answer,这也是我的问题,他们说当你只有两种类型的边时,可以在O(V+E)中运行Kruskal。我明白了,但是我没有得到不相交的东西,我认为这会造成更复杂的情况。

1 个答案:

答案 0 :(得分:1)

您可以通过查看disjoint-set container

来检查顶点是否在集合中

对于任何操作,不相交集最多具有 O(α(n))时间复杂度。这里αinverse Ackerman function,对于您或其他任何人使用的输入,该值小于5。

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

结果是Kruskal的算法最终花费了每次操作的 O(α(n))时间,实际上,就像花费时间一样。< / p>