- 1、本文档共59页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
厦门理工3算法设计与(第三章)讲述
计算计算法设计与分析 第三章贪心算法 最小生成树 设G = (V, E)是无向连通带权图,即一个网络。E的每条边(v, w)的权为c[v][w]。 树的基本性质 连通无回路的图G称为树。 树是点比边多一且连通, q=p–1且连通 。 树是点比边多一且无回路: q=p–1且无回路。 树若添条边就有回路:G无回路,若u, v?G且uv ? E(G),则G+uv中恰有一条回路。 树若减条边就不连通:G连通,对?e∈E(G), G–e不连通。 n个顶点的连通图的生成树含有n – 1条边。 求最小生成树的思路 一个很直观的简单想法:依次选出依据图G的权重较轻的n – 1条边。这样得到的n – 1条边的权重之和肯定是最小的。但是这样是否就得到了G的一棵最小生成树呢? 求最小生成树的两种策略 策略一:在保证连通的前提下依次选出权重较小的n – 1条边(在实现中体现为n个顶点的选择)。 策略二: 在保证无回路的前提下依次选择权重较小的n – 1条边。 Prim算法 基本思想:设G=(V, E)为无向连通带权图,令V={1, …, n}。在保证连通的前提下依次选出权重较小的n – 1条边。 设置一个集合S ,初始化S = {1},T = ?。 如果V–S中的顶点j与S中的某点i连接且(i, j)是E-T中的权重最小的边,于是就选择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算法的实现 Prim(int n, Type **c) { Prim算法的实现 Prim(int n, Type **c) { Prim算法的实现 Prim(int n, Type **c) { Prim算法的实现 Prim(int n, Type **c) { Prim算法的示例 给定一个连通带权图如下: Prim算法的示例 给定一个连通带权图如下: Prim算法的示例 给定一个连通带权图如下: Prim算法的示例 给定一个连通带权图如下: Prim算法的示例 给定一个连通带权图如下: Kruskal算法 基本思想:在保证无回路的前提下依次选出权重较小的n – 1条边。 具体做法:若(i, j)是E中尚未被选的边中权重最小的,且(i, j)不会与已经选择的边构成回路,于是就选择 (i, j)。 Kruskal算法 基本思想:在保证无回路的前提下依次选出权重较小的n – 1条边。 具体做法:若(i, j)是E中尚未被选的边中权重最小的,且(i, j)不会与已经选择的边构成回路,于是就选择 (i, j)。 Kruskal算法的数据结构 数组e[][]表示图的边,e[i][u]、e[i][v]和e[i][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; j = 1; while (k n) {a = Find(e[j][u]); b = Find(e[j][v]); if (a != b) {t[k++] = j; Union(a, b)} j++ }} Kruskal算法的例子 Kruskal算法的例子 Kruskal算法的例子 Kruskal算法的例子 Kruskal算法的例子 Kruskal算法的例子 Kruskal算法的例子 Kruskal算法的例子 Prim与Kruskal两算法的复杂性 Prim算法为两重循环,外层循环为n次,内层循环为O(n),其复杂性为O(n2)。 Kruskal算法中,设边数为e,则边排序的时间为O(eloge),确定边的时间为O(e),所以整个时间复杂性为O(eloge)。 边数e和顶点数n最多为:e=n(n – 1)/2。 若边多点少,Prim算法较好; 若边少点多,Kruskal算法较好。 贪心
您可能关注的文档
最近下载
- 沪教版七年级数学上学期考试满分全攻略第10章分式【单元提升卷】(沪教版)(原卷版+解析).docx VIP
- 学生心存感恩主题国旗下讲话稿.docx VIP
- 《妇幼保健学》课件——第十二章 围绝经期保健.pptx VIP
- 2024年全国职业院校技能大赛中职组(舞蹈表演赛项)考试题库(含答案)_已识别.pdf VIP
- 译林四上 Project1 教学课件.ppt VIP
- 乳腺癌的护理常规课件.pptx
- 2023年驾培相关项目运行指导方案.pdf VIP
- 个案工作 第八章-儿童辅导.pptx VIP
- 2024年山西航空产业集团有限公司人员招聘考试题库及答案解析.docx
- 运动解剖学(李世昌)第4章 消化系统.ppt VIP
文档评论(0)