prim算法直观理解与证明

今天刚学完最小生成树,乘着知识还在脑袋里热乎着,便写下来记录下,也便日后复习回忆。prim算法是用来求解最小生成树的。

总的来说算法步骤就是:

1.将距离集合(即最小生成树)的距离最近的点加入到集合中,如果集合中当前没有点,则可以任意加入某一个点。(该点到集合的距离定义为该点到集合中每个点的距离中最小的那一个距离。)

2.用新加入到集合中的点来更新未被加入到集合中的点到集合的距离。

3.重复1, 2步骤直到所有点都被加入到集合当中。此时集合中的连通路径即为最小生成树。

直观理解:首先对于一个图G(包含多个顶点和多条边),那么最小生成树就是所有边的权之和是所有子集中最小的,并且该子集的边能保证图是连通的。通俗来讲就是可以连接图中所有点的并且没有回环的路径。

        起初集合中没有点,那么集合中添加一点后,之后继续添加的点只能是图中与集合内部的点直接相连的点(中间没有其他点),这是因为不存在回环。那么为了使最小生成树的边的权总和最小,我们直观地就想在添加每个点的时候先加入与集合距离最小的点。

证明:采用反证法进行证明:

 首先让我们来规定符号:

        根据每个点加入生成树的先后顺序不同分别记为a_1, a_2, a_3,.....        ,并且令e_i来表示(v_x, v_i),其中x小于i.接着我们假设Prim算法无法构建出“正确”的最小生成树。

        那么假设通过prim算法已经加入到集合中的点为a_1, a_2, a_3,...,a_{j-1},此时已经构建出来的部分最小生成树与“正确”的最小生成树里面相应的部分相同,但接下来通过prim算法即将加入到集合中的点a_j,或说是边e_j却与“正确的最小生成树”不同,即e_j是发生错误的第一条边。而“正确”的最小生成树到达a_j点是通过其他的路径,并记“正确”的最小生成树接下来要添加的边记为e,添加的点记为a。我们想象出这样的图形,在完整的“正确的”最小生成树中,加入e_j这条边,那么在这个图形就产生了回环,如下图所示因此需要删掉一条边,那么就要从e_j, e两边之间进行选择喽,那正常来说肯定是要删掉e_j来恢复为“正确的”最小生成树喽。可是,因为为了保障各边权值和最小,那么所删除的e_j一定比e的权要大,,又因为原来”而prim算法在添加e_j的时候就说明了与e相比,e_j的权最小,因此就矛盾论了,因此prim算法一定会选对边,即prim算法一定是正确的的。

参考文献:

《数据结构与算法分析(C++版)》(第三版)【美】Clifford A. Shaffer 著  张铭 刘晓丹 译

 

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Quillan_car

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值