算法设计与第三章贪心算法精编.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
计算机算法设计与分析 第三章 贪心算法 贪心算法的特点 贪心算法总是作出在当前来看是最好的选择。 就是说,贪心算法并不从整体最优上来考虑,所作出的选择只是某种意义上的局部最优选择。 当然希望贪心算法得到的最终结果是最优的。 可是贪心算法并不能保证最终结果是最优的。 不过,在许多的情况下,应用贪心算法能够得到整体最优解;并且在一些情况下,即使得到的不是最优解,也是一个很好的近似解。 贪心算法的一般框架 GreedyAlgorithm(parameters){ 初始化; 重复执行以下的操作: 选择当前可以选择的(相容)最优解; 将所选择的当前解加入到问题的解中; 直至满足问题求解的结束条件。 } 最小生成树 设G = (V, E)是一个无向连通带权图,即一个网络。E的每条边(v, w)的权为c[v][w]。 树的基本性质 连通无回路的图G称为树。 树是点比边多一的连通图,G连通且q=p–1 。 树是点比边多一的无回路图:G无回路且q=p–1 树若添条边就有回路:G无回路,但对任意的u, v∈V(G),若uv?E(G),则G+uv中恰有一条回路 树若减条边就不连通:G连通,但对?e∈E(G), G–e不连通。 n个顶点的连通图的生成树含有n – 1条边。 最小生成树的贪心选择性质 令G中权最小的边为e1。首先必定有图G的一棵最小生成树包含了e1。 Prim算法 基本思想:在保证连通的前提下依次选出权重较小的n – 1条边。 G=(V, E)为无向连通带权图,令V={1, 2, …, n}。 设置一个集合S ,初始化S = {1},T = Φ。 贪心策略:如果V–S中的顶点j与S中的某个点i连接且(i, j)是E中的权重最小的边,于是就选择j(将j加入S),并将(i, j) 加入T中 。 重复执行贪心策略,直至V–S为空。 Prim算法中的数据结构 图用连接矩阵C[i][j]给出,即C[i][j]为结点i到结点j的权重。 为了有效地找出V–S中满足与S中的某个点i连接且(i, j) 权重最小的顶点j,对其中的每个顶点j设立两个数组closest[j]和lowcost[j]: closest[j]是s中与j最近的顶点,(closest[j], j)即为选中的边,而lowcost[j]是相应边的权重。 Prim算法的实现 Prim(int n, Type **c) { Prim算法的示例 给定一个连通带权图如下: Kruskal算法 基本思想:在保证无回路的前提下依次选出权重较小的n – 1条边。 贪心策略:如果(i, j)是E中尚未被选中的边中权重最小的,并且(i, j)不会与已经选择的边构成回路,于是就选择 (i, j)。 Kruskal算法的数据结构 数组e[][]表示图的边,e[i][u]、e[i][v]和e[k][w]分别表示边i的两个端点及其权重。 函数Sort(e, w)将数组e按权重w从小到大排序。 一个连通分支中的顶点表示为一个集合。 函数Initialize(n)将每个顶点初始化为一个集合 函数Find(u)给出顶点u所在的集合。 函数Union(a, b)给出集合a和集合b的并集。 重载算符!=判断集合的不相等。 Kruskal算法的实现 Kruskal(int n, **e) { Sort(e, w); //将边按权重从小到大排序 initialize(n); //初始时每个顶点为一个集合 k = 1; //k累计已选边的数目, j = 1; //j为所选的边在e中的序号 while (k n) //选择n – 1条边 {a = Find(e[j][u]); b = Find(e[j][v]); //找出第j条边两个端点所在的集合 if (a != b) {t[k++] = j; Union(a, b)} //若不同,第j条边放入树中并合并这两个集合 j++ }} //继续考察下一条边 Kruskal算法的例子 Prim与Kruskal两算法的复杂性 Prim算法为两重循环,外层循环为n次,内层循环为O(n),因此其复杂性为O(n2)。 Kruskal算法中,设边数为e,则边排序的时间为O(e),确定边的时间为O(loge),所以整个时间复杂性为O(eloge)。 当e = Ω(n2)时,Kruskal算法要比Prim算法差; 当e = ο(n2)时,Kruskal算法比Prim算法好得多。 贪心算法也能获得最优解 用Kruskal算法得到的生成树T*必是最优树。 证明:设T*不是最优,令T是与T*有k条共同边的最优树且k是最优树与T*共有边数的最大值 ∵ T≠T* ∴ ?ek+1: ek+1? E(T)且ek+1∈E(

文档评论(0)

贪玩蓝月 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档