kruskal算法的性能如何受到不相交集数据结构的影响?

时间:2017-08-17 19:32:42

标签: algorithm graph-algorithm minimum-spanning-tree kruskals-algorithm disjoint-sets

我对Kruskal的算法有了基本的了解,这就是我发现的:

该算法基本上通过合并多个树来构建最小生成树,并且首先按权重对边进行排序。从空子图开始,算法扫描边缘列表,如果它没有创建循环,则将下一个边缘添加到子图。

其中,不相交集是一种数据结构,实际上几乎没有办法通过使用链表或森林树方法来派生最小生成树。

我想知道的是,不相交集如何影响 Kruskal 算法的性能?任何帮助都可以得到赞赏。

2 个答案:

答案 0 :(得分:1)

Kruskal的算法首先对边缘进行排序。这可以在O(E*log(E)) = O(E*log(V^2)) = O(E*2*log(V)) = O(E*log(V))时间内完成。

然后遍历边缘并执行O(E)不相交集数据结构操作(2在每次迭代时找到&可能1并联)。操作的复杂性取决于不相交集的实现。天真实现具有O(V)联合操作和O(1)查找操作。这会导致O(E + V^2)时间,因为并集操作最多会执行V次,但即使使用 union by rank 的不相交集林,两个操作的复杂性也是{{ 1}}(可以O(log(V))添加路径压缩)。

因此,Kruskal的算法具有天真的不相交集数据结构实现:
O(α(V))(在足够稀疏的图表中,第二学期将占主导地位)

至少按行级联合的实施:
O(E*log(V)) + O(E + V^2) = O(E*log(V) + V^2)

答案 1 :(得分:1)

数据结构'不相交集'确保O(E * logE)整体复杂性非常重要。

让我们考虑标准的kruskal算法。

KRUSKAL(G):

A = ∅
foreach v ∈ G.V:
    MAKE-SET(v)
foreach (u, v) in G.E ordered by weight(u, v), increasing:
   if FIND-SET(u) ≠ FIND-SET(v):
       A = A ∪ {(u, v)}
       UNION(u, v)
return A

FIND-SET()和UNION()方法识别集合(或林)并加入它们。 这两个操作都可以在O(1)中使用'不相交的集合来完成。数据结构。 FIND和UNION部分的总体复杂性为O(E)。

我们把它放在一起 O(V)+ O(E * logE)+ O(E)= O(E * logE)

因此,数据结构'不相交集合'确保O(E * logE)整体复杂性非常重要。