最小生成树算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最小生成树算法
最小生成树:
在一给定的无向图G=(V,E)中,(u,v)代表连接顶点u与顶点 v 的边,而w(u,v)代表此边的权重,若存在T为E的子集且为无循环图,使得
w(T)最小,则此T为G的最小生成树。
最小生成树其实是最小权重生成树的简称。
最小生成树性质:设G=(V,E)是一个连通网络,U是顶点集V的一个非空真子集。若(u,v)是G中一条一个端点在U中(例如:u∈U),另一个端点不在U中的边(例如:v∈V-U),且(u,v)具有最小权值,则一定存在G的一棵最小生成树包括此边(u,v)。
一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有n个结点,并且有保持图连通的最少的边。最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。
一.性质:
最小生成树性质:设G=(V,E)是一个连通网络,U是顶点集V的一个非空真子集。若(u,v)是G中一条“一个端点在U中(例如:u∈U),另一个端点不在U中的边(例如:v∈V-U),且(u,v)具有最小权值,则一定存在G的一棵最小生成树包括此边(u,v)。
二.起源和发展:
计算稠密图的最小生成树最早是由罗伯特·普里姆在1957年发明的,即Prim算法。之后艾兹赫尔·戴克斯特拉也独自发明了它。但该算法的基本思想是由沃伊捷赫·亚尔尼克于1930年发明的。所以该算法有时候也被称为Jarník算法或者Prim-Jarník算法。20世纪70年代,优先队列发明之后很快被用在了寻找稀疏图中的最小生成树上。1984年,迈克尔·弗里德曼和罗伯特·塔扬发明了斐波那契堆,Prim 算法所需要的运行时间在理论上由E log E提升到了E + V log V。约瑟夫·克鲁斯卡尔在1956年发表了他的算法,在他的论文中提到了Prim 算法的一个变种,而奥塔卡尔·布卢瓦卡在20世纪20年代的论文中就已经提到了该变种。M.Sollin在1961年重新发现了该算法,该算法后成为实现较好渐进性能的最小生成树算法和并行最小生成树算法的基础。
三.应用:
生成树和最小生成树有许多重要的应用。例如:要在n个城市之间铺设光缆,主要目标是要使这n 个城市的任意两个之间都可以通信,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要使铺设光缆的总费用最低。这就需要找到带权的最小生成树。
四.算法描述:
求MST的一般算法可描述为:针对图G,从空树T开始,往集合T 中逐条选择并加入n-1条安全边(u,v),最终生成一棵含n-1条边的MST。
当一条边(u,v)加入T时,必须保证T∪{(u,v)}仍是MST的子集,我们将这样的边称为T的安全边。
1.最小生成树Prim算法简述
1).输入:一个加权连通图,其中顶点集合为V,边集合为E;
2).初始化:Vnew= {x},其中x为集合V中的任一节点(起始点),Enew= {},为空;
3).重复下列操作,直到Vnew= V:
a.在集合E中选取权值最小的边,其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);
b.将v加入集合Vnew中,将边加入集合Enew中;
4).输出:使用集合Vnew和Enew来描述所得到的最小生成树。[1]
2.最小生成树Kruskal算法简述
假设WN=(V,{E}) 是一个含有n 个顶点的连通网,则按照克鲁斯卡尔
算法构造最小生成树的过程为:先构造一个只含n 个顶点,而边集
为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它
是一个含有n 棵树的一个森林。之后,从网的边集E 中选取一条权
值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,
也就是说,将这两个顶点分别所在的两棵树合成一棵树;反之,若该
条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。依次类推,直至森林中只有一棵树,也即子图中含有n-1条边为止。
3.Borůvka算法:
第一个用于寻找最小生成树的算法由捷克科学家奥塔卡尔·布卢瓦卡提出,即Borůvka算法。
4.更快的算法:
一些研究者希望可以找出更为高效的算法,在这方面也有了一定的成果。Karger,Klein & Tarjan (1995)针对边的权值可以成对比较的特殊模型提出了一个基于Borůvka算法和翻转删除算法的可以在线性时间内解决最小生成树的算法。
最快的非随机比较算法是由伯纳德·沙泽勒提出的。该算法依赖于soft heap这样一个类似于优先级队列的数据结构。该算法的时间复杂度为O(Eα(E,V))。α就是阿克曼函数反函数,α的增长速度非常慢,对于一般的数值来说,其值很难超过5,所以该算法的复杂度可以近似看成是线性时间。