我对Kruskal的算法有了基本的了解,这就是我发现的:
该算法基本上通过合并多个树来构建最小生成树,并且首先按权重对边进行排序。从空子图开始,算法扫描边缘列表,如果它没有创建循环,则将下一个边缘添加到子图。
其中,不相交集是一种数据结构,实际上几乎没有办法通过使用链表或森林树方法来派生最小生成树。
我想知道的是,不相交集如何影响 Kruskal 算法的性能?任何帮助都可以得到赞赏。
答案 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)整体复杂性非常重要。