《算法导论》第23章 最小生成树 个人笔记


第23章 最小生成树

23.1 最小生成树的形成

本章所讨论的两种算法都使用贪心策略,但两者使用的贪心策略有所不同。这个贪心策略可以由下面的通用方法来表达,该通用方法在每个时刻生长最小生成树的一条边,并在整个策略的实施过程中,管理一个遵守下述循环不变式的边集合A:在每遍循环之前,A是某棵最小生成树的一个子集。

23.2 Kruskal算法和Prim算法

1、Kruskal算法
  • FIND-SET(u)是否等于FIND-SET(v)来判断结点u和结点v是否属于同一棵树
  • 使用UNION过程来对两棵树进行合并。
  • 时间复杂度为 O(ElgV)
MST-KRUSKAL(G,w){
    A = new Set()
    for v in G.V
        MAKE-SET(v)
    sort the edges of G.E into nondecreasing order by weight w
    for edge(u,v) in G.E, take in nondecreasing order by weight
        if FIND-SET(u) != FIND-SET(v)
            A = A + {(u,v)}
            UNION(u,v)
}
2、 Prim算法
  • 所有不在树A中的结点都存放在一个基于key属性的最小优先队列Q中。
  • 对于每个结点v,属性v.key保存的是连接v和树中结点的所有边中最小边的权重。我们约定,若不存在这样的边,则v.key = inf。
  • 属性v.p给出的是结点v在树中的父结点
  • 时间复杂度为 O(ElgV)
MST-PRIM(G,w,r){ //随机选择的一个开始结点r
    for u in G.V
        u.key = inf
        u.p = NIL
    r.key = 0
    Q = G.V
    while(!Q.isEmpty){
        u = EXRACT-MIN(Q)
        for v in G.Adj[u]
        if v in G && w(u,v)<v.key
            v.p = u
            v.key = w(u,v)
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值