“学习笔记”之《算法导论》----第六部分----图算法----第二十三章----最小生成树

本人大四即将结束,于2018年12月18日购《算法导论》这本书,慢慢看,第一阶段先主要理解各个章节说的算法都是什么意思,书上的课后习题先不做,用得上什么算法我再详细学习。这是官方课后答案的链接。

放在开头:没有好的算法,坏的算法之说,重点是针对不同的情况,针对不同的数据,针对不同的需求,去选择算法,改良算法。我的数学功底不强,太难的公式我看不懂,太高深的思想我理解不了,我主要以应用为主,不以解释数学公式为主。

问题的引出:

在电子电路设计中,我们需要将多个元器件的引脚连在一起。如果有n个引脚,就得用n-1根线,每根连线链接两个引脚,我们希望使用的连线长度最短。

我们可以用图的方法去解决问题,G=(V,E),V是代表引脚,E代表引脚之间的连线,同时,E中的每个元素还具备一个属性w,w权重,代表两个引脚之间,连接的代价。

我们的目的就是找到一个无环子集,将所有的引脚连接起来,同时达到最小的权重。这样的问题就叫最小生成树问题。

对于最小生成树问题,本章提出了两种贪心算法。

Kruskal算法

我们的目的,是找一棵树,树上的结点包括全部的V,而且,这个树必须是无环的,就是说,从最小生成树的某个结点出发,是回不到这个结点的。

kruskal算法第一步,将所有的E,按权重w从小到大排好,从带有最小的w的边开始选,遍历所有的E,如果当前的边的两个结点不属于同一棵树,那么就将这个边加入到我们要生成的最小生成树中。

下图来源于原书,这个图是Kruskal算法的执行过程,带阴影的边是被加入到最小生成树中的。

 “学习笔记”之《算法导论》----第六部分----图算法----第二十三章----最小生成树_第1张图片

Prim算法 

这个算法与Dijkstra的最短路径算法相似。

这棵树从一个任意的根节点r开始,一直长大到覆盖V中所有的结点为止。

比较一下kruskal算法:

Prim是从一个树的根节点开始拓展,kruskal是合并多棵子树。

下面这个图是书上的,上面的‘割线’是我画的,prim重点在于找‘安全边’

什么是安全边?每个割线相交的Edge中w最小的,就是安全边。以安全边一点一点拓展,形成最终的最小生成树。

“学习笔记”之《算法导论》----第六部分----图算法----第二十三章----最小生成树_第2张图片

你可能感兴趣的:(算法导论)