克鲁斯卡算法gydF4y2Ba
有几种求最小值的算法gydF4y2Ba生成树gydF4y2Ba其中之一是gydF4y2Ba克鲁斯卡算法gydF4y2Ba.算法执行如下。gydF4y2Ba
克鲁斯卡算法gydF4y2Ba
- 设置空集gydF4y2Ba
一个= {}gydF4y2Ba
和gydF4y2BaF = EgydF4y2Ba
在哪里gydF4y2BaEgydF4y2Ba
是所有边的集合。gydF4y2Ba选择一条边gydF4y2Ba
egydF4y2Ba
在gydF4y2BaFgydF4y2Ba
的最小重量,并检查是否增加gydF4y2BaegydF4y2Ba
来gydF4y2Ba一个gydF4y2Ba
创建一个循环。gydF4y2Ba
- 如果有,请移除gydF4y2Ba
egydF4y2Ba
从gydF4y2BaFgydF4y2Ba
- 如果没有,就移动gydF4y2Ba
egydF4y2Ba
从gydF4y2BaFgydF4y2Ba
来gydF4y2Ba一个gydF4y2Ba
如果gydF4y2Ba
F = {}gydF4y2Ba
停止并输出最小生成树gydF4y2Ba(V)gydF4y2Ba
.gydF4y2Ba
Kruskal算法就是一个很好的例子gydF4y2Ba贪婪算法gydF4y2Ba在这个过程中,我们会做出一系列决定,每一个决定都在当时看来是最好的。局部决策是将哪条边添加到生成树中。在每一种情况下,我们选择具有最小标号的边,该边通过完成一个循环而不违反生成树的定义。通常,局部最优解的整体效果不是全局最优的。但是Kruskal的算法是不正确的。gydF4y2Ba
证明了Kruskal算法的运行时间为gydF4y2Ba 在图上gydF4y2Ba 节点和gydF4y2Ba 是节点或边中较大的。gydF4y2Ba
假设这个图是用邻接表表示的,所以我们可以找到图中所有的边gydF4y2Ba 时间。gydF4y2Ba
我们必须首先按标号对边排序,这需要gydF4y2Ba 时间,如果我们用归并排序。接下来,我们考虑边,取gydF4y2Ba 该做所有的合并和查找了。看来Kruskal算法的总时间是这样的gydF4y2Ba
然而,请注意,gydF4y2Ba 因为只有gydF4y2Ba 成对的节点。因此,gydF4y2Ba 和gydF4y2Ba .由于常数可以忽略,我们得出结论,确实需要gydF4y2Ba 时间。gydF4y2Ba