Kruskal
算法 - 克鲁斯卡尔算法,是一种用来寻找最小生成树的算法。在剩下的所有未选取的边中,找最小边;如果和已选取的边构成回路,则放弃选取次小边。
概念
最小生成树 MST: Minimum Spanning Tree
:也是最小权重生成树的简称。一幅加权无向图,包含所有顶点的无环连通子图,该子图中所有边( V-1
条边)的权值之和最小。
算法定义
Kruskal
算法的主要思想是按照边的权重顺序(从小到大)处理它们,将边加入最小生成树中,加入的边不会与已经加入的边构成环,直到树中含有 V-1
条边为止。
动画演示
算法解析
weight
记录最小生成树的总权重。Queue<Edge> mst
队列
记录最小生成树中所有的边。MinPQ<Edge> pq
最小优先队列
小根堆,加入所有边,堆顶为权重最小的边。UF uf
并查集
判断无向图中两个顶点的连通性。
算法实现非常简单:
- 将所有边加入最小优先队列,确保堆顶都是最小权重边
- 根据顶点个数建立并查集
- 小根堆取出堆顶元素,如果边两端的顶点不连通,根据
Kruskal
算法定义,将边加入最小生成树mst
队列中;如果两个顶点连通,则忽略这条边 - 直到小根堆所有边取出或者达到
V-1
条边,最小生成树完成
1 | public class KruskalMST { |
小结
- 时间复杂度
使用优先队列和并查集,优先对列长度为E
,取出最小边时间复杂度为logE
,而并查集接近常数,所以总的时间复杂度为O(ElogE)
。
参考文档
- 《算法:第四版》 第 4 章
- algs4: mst
- visualgo动画-Kruskal实现