- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* * Greedy Approach贪心算法 * * 贪心算法的特点 贪心算法总是作出在当前来看是最好的选择。 就是说,贪心算法并不从整体最优上来考虑,所作出的选择只是某种意义上的局部最优选择。 当然希望贪心算法得到的最终结果是最优的。 可是贪心算法并不能保证最终结果是最优的。 不过,在许多的情况下,应用贪心算法能够得到整体最优解;并且在一些情况下,即使得到的不是最优解,也是一个很好的近似解。 * * 贪心算法的一般框架 GreedyAlgorithm(parameters){ 初始化; 重复执行以下的操作: 选择当前可以选择的(相容)最优解; 将所选择的当前解加入到问题的解中; 直至满足问题求解的结束条件。 } * * 最小生成树 设G = (V, E)是一个无向连通带权图,即一个网络。E的每条边(v, w)的权为c[v][w]。 如果G的一个子图G’是一棵包含G的所有顶点的树,则称G’为G的生成树。 生成树的各边的权的总和称为该生成树的耗费。 在G的所有生成树中,耗费最小的生成树称为G的最小(优)生成树。 * * 树的基本性质 连通无回路的图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。 若G的任何最小生成树都不包含e1。设T为G的最小生成树,e1?T。于是T+e1是一个有回路的图且该回路中包含e1。该回路中必有条不是e1的边ei。令T’={T+e1}–ei。T’也是G的生成树。又c(T’) = c(T) + c(e1) – c(ei),c(e1) ≤ c(ei),从而 c(T’)≤c(T),T’是G的最小生成树且含有边e1。矛盾。故必定有图G的最小生成树包含了e1。 选定第一条边e1以后,该如何选择第二条边呢? 依据各条边的权重,依次选出权重较轻的n – 1条边。这n – 1条边必定包括了G的n个顶点。这样就得到了G的一棵最小生成树。 这样做是否可以呢? 不行!因为不能保证这n – 1条边构成树? 要保证这n – 1条边构成树,必须使这n – 1条边是连通的或者是无回路的。 Prim算法的做法:在保证连通的前提下依次选出权重较小的n – 1条边(在实现中体现为n个顶点的选择)。 Kruskal算法的做法:在保证无回路的前提下依次选择权重较小的n – 1条边。 * * 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) { 初始化:结点1放入S;并初始化lowcost[]和 closest[]; 执行以下操作n–1次: 依据lowcost[]找出与S最近的点j并放入S; 调整lowcost[]和closest[];} int j = 1; s[j] = true; for (int i = 2; i = n; i++) { closest[i] = 1; lowcost[i]=c[1][i]; s[i]=false;} for (int i = 1; i n; i++) {min= inf; for (int k = 2; k = n; k++) { if (lowcost[k]min!s[k]) {min = lowcost[k]; j = k} s[j] = true;
您可能关注的文档
最近下载
- 制定手机使用协议书.docx VIP
- 隐形矫正培训课件.pptx VIP
- 2025年高考化学一轮复习:物质的分类及转化(讲义)解析版.pdf VIP
- 2023中华护理学会团体标准-老年人误吸的预防.pptx VIP
- 《Rubis软件2017版》操作手册.pdf VIP
- 标准图集-08CJ17快速软帘卷门 透明分节门 滑升门 卷帘门.pdf VIP
- 消化内科-病历讨论.pptx VIP
- (⼈教2019版)化学 选必1 第三单元 水溶液中的离子反应与平衡 大单元教学设计.docx
- SHT 3525-2015 石油化工低温钢焊接规范.pdf VIP
- Q/CRRC J26-2018- 轨道交通装备产品禁用和限用物质.pdf VIP
文档评论(0)