算法基础篇(8)------最小生成树

来源:互联网 发布:网站页面优化 编辑:程序博客网 时间:2024/05/24 03:35

● 每周一言

态度与成果,是赢得话语权的最好方式。

导语

最小生成树顾名思义,首先是一棵树,而“最小”的含义是指其边长之和最小,其常用算法有prim(普里姆)算法和kruskal(克鲁斯卡尔)算法两种。那么,最小生成树能解决什么问题?这两种算法分别是如何实现的?

最小生成树

我们不妨从实际问题开始着手:在N个城市之间铺设光缆,城市间铺设光缆的费用各不相同,现要求任意两个城市可以通信,求铺设光缆的最小花费。

根据题目描述,我们可以将城市作为节点,城市间以边相连,光缆铺设费用则为边长,构成无向图。求最小铺设费用即等价于求出这张无向图的最小生成树。现假设有A、B、C、D共4个城市,城市间光缆铺设费用分别为AB = 8,AC = 1,AD = 6,BC = 3,BD = 2,CD = 5。下面分别讲一下prim和kruskal这两种算法的实现思路。

prim算法 该算法可以从任意节点开始建树。一句话概括其算法思想为:从原点开始,每次添加与当前最小生成树相连且不成环的最短边,直到添加所有节点为止。这里我们从A节点开始推进算法,步骤如下图所示:

fig1

以A为最初的最小生成树开始,首先添加与之相连不成环且最短的AC边,然后按规则依次添加BC、BD边,所有节点均已添加,因此算法结束,最小花费为1 + 3 + 2 = 6。一般情况下,prim算法的时间复杂度为O(V^2)。

kruskal算法 一句话概括该算法的基本思想为:每次从待选边集中选出与当前森林不成环且最短的边加入森林,直到所有节点形成一颗树为止。该思想决定了kruskal算法只能从最小的边开始建树,算法推进步骤如下图所示:

fig2

从最短的AC边开始建树,首先将AC边加入森林,然后按规则依次加入BD、BC边,所有节点已构成一棵树,因此算法结束,最小花费同样为1 + 2 + 3 = 6。这里需要用到排序,一般情况下我们使用快排,因此kruskal算法的时间复杂度为O(ElogE)。

值得一提的是,稠密图(边数较多)适合用prim算法,而稀疏图则适合用kruskal算法。敬请期待下节内容。

结语

感谢各位的耐心阅读,后续文章于每周日奉上,欢迎大家关注小斗公众号 对半独白

face

0 0