MIT算法导论公开课之第16课 贪婪算法、最小生成树

关于图的知识回顾(附录B)

有向图(Digraph,Direct graph)G=(V,E),V为图的顶点集,E为边集,E∈V x V。
无向图(Undirected graph)G=(V,E),E为无向的边集。
|E|=O(V^2)
连通图,对于图中的任意顶点,总有路径可以到达其他顶点,|E|>=|V|-1。
对于连通图,则有lg|E|= O(lg(V^2))=O(lgV)=Ω(lg(|V|-1))=Ω(lgV)=Θ(lgV)。

图的表示

  • 邻接矩阵:
    图G=(V,E),设V为{1,2,…,n},邻接矩阵则是一个n x n的矩阵A,且当(i,j)∈E时,A[i,j]=1,否则A[i,j]=0。
    • Ex:
      邻接矩阵
      存储空间占用情况为Θ(V^2),用于稠密图(边数尽可能的多)的存储效果会比较好。
      邻接矩阵可用一位表示每一条边的情况。
      稀疏图例子:链表、平面图,自由树。稠密图例子:完全图。
  • 邻接表:
    链表Adj[v]为所有与v邻接的点的集合。
    Ex:
    邻接表
    可见链表的长度|Adj[v]|,也就是无向图中顶点v的度,有向图中顶点v的出度
    • 握手定理:设G=(V,E)为任意无向图,则所有顶点的度数和=2·|E|。
      邻接表的存储空间占用情况为Θ(V+E),用于稀疏图的表示。
    • 邻接表需要使用O(lgV)位来表示一个顶点(数量为V,可用O(lgV)位编码每一种)。
    • 矩阵和图是看待同一种事物的两种不同方式,相似的性质可能同时出现在这两者中。
      注:附录B中关于树给出一些定义和性质,很值得看一看。

最小生成树

最小生成树

MST动态规划思路

  • 最优子结构分析:
    最小生成树MST T(图的其他边都被忽略):
    MST最优子结构分析
    删除(u,v)∈T,那么最小生成树T被分为两个子树T1和T2。
    • 证明定理:
      设图G1=(V1,E1)为原图G的一个子图,且满足V1为T1中的所有顶点,而边集E1={(x,y)∈E,x,y∈V1},那么T1为G1的最小生成树(同理T2也有这样的结果)。
      • 剪贴法(Cut & Paste):
        W(T)=w(u,v)+W(T1)+W(T2)
        假设图G1有个比T1权值和更小的生成树T1‘,那么显然,就会有W(T)=w(u,v)+W(T1’)+W(T2),与W(T)=w(u,v)+W(T1)+W(T2)相矛盾,所以假设不成立,上述定理得证。
  • 重叠子问题分析:
    在删除(u,v)划分子树的过程中,不同的删除顺序中划分出相同的子树。
    最小生成树问题具有重叠子问题。
  • 综上可知,最小生成树可以使用动态规划。

贪婪算法(Greedy algorithm)问题特性

问题中存在一个局部最优解同时也是全局最优解。

MST贪婪算法思路

MST贪婪算法思路

Prim算法

Prim算法

猜你喜欢

转载自blog.csdn.net/rye_whiskey/article/details/82152078