Sch1-4分治法.pptVIP

  • 10
  • 0
  • 约8.93千字
  • 约 39页
  • 2017-06-14 发布于天津
  • 举报
Sch1-4分治法.ppt

* 证明: 假设G的任何一棵最小生成树都不含边(u, v)。将边(u, v)添加到G的一棵最小生成树T上,将产生含有边(u,v)的圈,并且在这个圈上有一条不同于(u, v)的边(u’ , v’),使得u’∈U, v’∈V -U。如下图所示,将边(u’ , v’)删去,得到G的另一棵生成树T’。由于c[u][v]=c[u’ ][v’],所以T’的耗费=T的耗费。于是,T’是一颗含有边(u,v)的最小生成树,这与假设矛盾。 Sch1-4 贪心算法 U u u V v v 含边(u,v)的圈 * Prime算法 设G=(V,E)是连通带权图,V={1,2,…,n},算法思想为:首先置S={1},然后,只要S是V的真子集,就作如下的贪心选择:选取满足条件i?S,j?V-S,且c[i][j]最小的边,将顶点j添加到S中。这个过程一直进行到S=V时为止。 在这个过程中选取到的所有边恰好构成G的一棵最小生成树。 Sch1-4 贪心算法 Void Prime( n, c[][]) { T= Φ; S = {1}; while( S != V ){ (i,j) = i ∈ S且j ∈ V-S的最小权边; T = T U {(i,j)}; S = S U {j}; } } * Sch1-4 贪心算法 利用最小生成树性质和数学归纳法容易证明,上述算法中的边集合T始终包含G的某棵最小生成树中的边。因此,在算法结束时,T中的所有边构成G的一棵最小生成树。 例如,对于右图中的带权图,按Prim算法选取边的过程如下页图所示。 * Sch1-4 贪心算法 * 在上述Prim算法中,还应当考虑如何有效地找出满足条件i?S,j?V-S,且权c[i][j]最小的边(i,j)。实现这个目的的较简单的办法是设置2个数组closest和lowcost。 在Prim算法执行过程中,先找出V-S中使lowcost值最小的顶点j,然后根据数组closest选取边(j,closest[j]),最后将j添加到S中,并对closest和lowcost作必要的修改。 用这个办法实现的Prim算法所需的计算时间为 Sch1-4 贪心算法 * Kruskal算法 Kruskal算法构造G的最小生成树的基本思想是:首先将G的n个顶点看成n个孤立的连通分支。将所有的边按权从小到大排序。然后从第一条边开始,依边权递增的顺序查看每一条边,并按下述方法连接2个不同的连通分支:当查看到第k条边(v,w)时,如果端点v和w分别是当前2个不同的连通分支T1和T2中的顶点时,就用边(v,w)将T1和T2连接成一个连通分支,然后继续查看第k+1条边;如果端点v和w在当前的同一个连通分支中,就直接再查看第k+1条边。这个过程一直进行到只剩下一个连通分支时为止。 Sch1-4 贪心算法 * 例如,对前面的连通带权图,按Kruskal算法顺序得到的最小生成树上的边如下图所示。 Sch1-4 贪心算法 * 时间复杂度: 当图的边数为e时,Kruskal算法所需的时间是 : 当 时,Kruskal算法比Prim算法差; 当 时,Kruskal算法却比Prim算法好得多。 Sch1-4 贪心算法 谢谢! * * Q A University of Science and Technology of China University of Science and Technology of China University of Science and Technology of China University of Science and Technology of China University of Science and Technology of China * 主讲人: 吕敏 Email: { lszhuang@ustc.edu.cn } Spring 2012 ,USTC 算法基础 * * 算法设计复习 内容提要: 算法设计思想回顾(递归和分治、动态规划、贪心算法、回溯法、分支限界法、随机算法) 经典例子讲解 算法设计策略 已学过的算法设计策略: 递归和分治 动态规划 贪心算法 回溯法 分支限界法 随机算法 * * * 基本思想:把一个规模大的问题划分为规模较小的子问题,然后分而治之,最后合并子问题

文档评论(0)

1亿VIP精品文档

相关文档