最小生成树(Minimum Spanning Tree,MST)
是COMP9007算法课中Graph章节下的一个重要知识点。
MST的定义是这种
树中包括了连通图里的所有顶点(Vertex),且树中所有边的权值之和最小。
在实际应用中,我们常用Prim算法和Kruskal算法来生成一个MST。
下面我们就来看看这两个算法的具体操作:
Prim算法
➤ 算法输入 一个加权连通图G,其中顶点集为V、边集为E,即G(V,E); ➤ 算法步骤 ①初始化用来存放MST的G1(V1,E1),其中V1 = {x},x为集合V中的任一节点(起始点); E1 = {},为空集; ②在集合E中选取权值最小的边,其中u为集合V1中的元素,而v在集合V中且不在V1集合当中(如果有多条具有相同权值的边,则可任意选取其中之一); ③将v加入集合V1中,将边加入集合E1中; ④重复操作②③直到V1=V; ➤ 算法输出 G1(V1,E1)用来记录生成的MST。 ➤ 时间复杂度 ❶ 使用邻接矩阵表示数据结构,不加任何优化,时间复杂度为O(n2),n为顶点个数 ❷ 使用二叉堆来记录数据,邻接表来记录边,时间复杂度为O(mlog2n),n为顶点个数、m为边的个数 ➤ 案例Kruskal算法
➤ 算法输入 一个加权连通图G,其中顶点集为V、边集为E,即G(V,E); ➤ 算法步骤 ❶ 初始化用来存放MST的G1(V1,E1),其中V1 = V,E1= {},为空集; ❷ 将G中所有的边按权值从小到大排序 ❸ 从权值最小的边开始,如果这条边连接的两个节点于图G中不在同一个连通分量中,则添加这条边到图G1中 ❹ 重复操作③直到G1中的所有节点都在同一个连通分量中。 ➤ 算法输出 G1(V1,E1)用来记录生成的MST。 ➤ 时间复杂度 Kruskal算法要借助并查集来实现, 其时间复杂度为O(mlog2n)+ O(mlog2m)+O(n), n为顶点个数、m为边的个数。 只有当图为稠密图时,时间复杂度表示为 O(mlog2m); 一般情况下图都是稀疏图,即m ➤ 案例更多学习资料分享
???