数据结构——图(二)
数据结构与算法——图(二)
前几天学习完图的遍历后,马上就开始了图的最小生成树,结果就心态爆炸,完全理解不了这两个算法——prim算法与Kruskal算法。接下来将对这两个算法进行解密,并且提供简单易于理解的解释。
Prim算法
首先熟悉一下接下来需要求最小生成树的图:
如果还不了解图的话,还是建议先理解数据结构与算法——图(一)的内容。接下来的内容会让大脑感到非常舒适,请坚持住!
作为一名程序员我们还是先看看代码吧,只需要关注prim方法即可。
1 |
|
根据上图,这样的解出来的结果是( 99 最小生成树权值总和数组: [0, 10, 8, 16, 7, 11, 16, 19, 12] )。为什么会是这样的结果呢?我们将这个过程当做修路来思考,每条边的权值就是修路的花费。
- 从顶点0开始,当我们在顶点0时,我们只能看到顶点1与顶点5的距离,那么我们会选择以修顶点0到顶点1的路。
- 当修到顶点1时,我们能看到顶点2、顶点8、顶点6与顶点5,那么这时候顶点5的花费是最小的,我们就修了顶点0到顶点5的路。
- 这时候又多了几个选择,我们以箭头表示(v1->v2, v1->v8, v1->v6, v5->v6, v5->v4),再根据之前的做法,选择花费最小的路,依次循环下去,直到每个地方都去过为止。
这就是prim算法的思路,图解如下:
Kruskal算法
实际上Kruskal算法也差不多,只不过它更简单一些,思路非常简单,那就是根据邻接表按权值排序从小到大找非回环路线。下面用一张图来表示它的执行过程:
这里对上图进行解释一下,图上邻接表中表示的1-15是循环的轮次,图中的箭头为对应轮次不造成回环响应的轮次。
- 第一次从邻接表的第一个开始,即顶点4到顶点7然后发现没有回环,进行将其走势存到parent数组中,进行下一轮循环。
- 第二次从邻接表的第二个开始,即顶点2到顶点8然后发现没有回环,继续下去,并且走到第七轮都没有发现回环。
- 第八轮从邻接表的第八个开始时,发现从顶点5到顶点6的话会出现回环,因此不进行任何操作,剩下的节点除了第十轮外,都因为产生了回环,所以最终结果就是sum为99。
其最终的parent数组的情况为{1,5,8,7,7,8,7,0,6,0,0,0,0,0,0}。下面附上Kruskal算法的代码:
1 |
|
现在算是初步理解了Prim算法和Kruskal算法的基本原理了,文中有表述不到位或者表述不当的地方,可以联系我,大家一起共同学习共同进步!
数据结构——图(二)
http://devonte.top/posts/blog/datastructure/Data_Structure__Algorithm__Graph__1.html