- 1、本文档共83页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《计算机算法设计与分析》PPT第四章 贪心算法
* 3、哈夫曼算法的正确性 要证明哈夫曼算法的正确性,只要证明最优前缀码问题具有贪心选择性质和最优子结构性质。 (1)贪心选择性质 (2)最优子结构性质 定理 设有n个权值W={w0,w1 , … ,wn-1}作为外结点的权值,构造两路合并树的贪心算法将生成一棵具有最小带权外路径长度的二叉树。 * * 4.5 单源最短路径 给定带权有向图G =(V,E),其中每条边的权是非负实数。给定V中的一个顶点,称为源。现在要计算从源到所有其它各顶点的最短路径长度。路径长度是指路上各边权之和。这个问题通常称为单源最短路径问题。 例:计算顶点1(源)到所有其他顶点之间的最短路径。 * 1、迪杰斯特拉(Dijkstra)算法 该算法是解单源最短路径问题的贪心算法。 基本思想:设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。 步骤 初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。 每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist作必要的修改。 一旦S包含了所有V中顶点,dist就记录了从源到所有其它顶点之间的最短路径长度。 * 例:对右图中的有向图,应用Dijkstra算法计算从源顶点1到其它顶点间最短路径。 迭代 S u dist[2] dist[3] dist[4] dist[5] 初始 {1} - 10 maxint 30 100 1 {1,2} 2 10 60 30 100 2 {1,2,4} 4 10 50 30 90 3 {1,2,4,3} 3 10 50 30 60 4 {1,2,4,3,5} 5 10 50 30 60 Dijkstra算法的迭代过程: * * 2、算法的正确性和计算复杂性 (1)贪心选择性质 贪心策略为:从V-S中选择具有最短特殊路径的顶点u,从而确定从源到u的最短路径长度dist[u]。 * 证明:(反证法) 即证明从源到u没有更短的其他路径。 假设存在一条从源到u且长度比dist[u]更短的路,设这条路初次走出S之外到达顶点为x#V-S,然后徘徊于S内外若干次,最后离开达到u,如上图所示。 在这条路径上,分别记d(v,x),d(x,u)和d(v,u)为顶点v到顶点x,顶点x到顶点u和顶点v到顶点u的路长,那么 dist[x]=d(v,x) d(v, x)+d(x, u)=d(v,u)dist[u] 利用边权的非负性,可知d(x,u)=0,从而推得dist[x]dist[u]。此为矛盾。这就证明了dist[u]是从源到顶点u的最短路径长度。 * (2)最优子结构性质 (3)计算复杂性 对于具有n个顶点和e条边的带权有向图,如果用带权邻接矩阵表示这个图,那么Dijkstra算法的主循环体需要O(n2) 时间。这个循环需要执行n-1次,所以完成循环需要O(n2) 时间。算法的其余部分所需要时间不超过 O(n2) 。 * 4.6 最小生成树 设G =(V,E)是无向连通带权图,即一个网络。E中每条边(v,w)的权为c[v][w]。如果G的子图G’是一棵包含G的所有顶点的树,则称G’为G的生成树。生成树上各边权的总和称为该生成树的耗费。在G的所有生成树中,耗费最小的生成树称为G的最小生成树。 * 应用实例 网络的最小生成树在实际中有广泛应用。 例: 在设计通信网络时,用图的顶点表示城市,用边(v,w)的权c[v][w]表示建立城市v和城市w之间的通信线路所需的费用,则最小生成树就给出了建立通信网络的最经济的方案。 电子线路设计 * 1、最小生成树性质 设G=(V,E)是连通带权图,U是V的真子集。如果(u,v)?E,且u?U,v?V-U,且在所有这样的边中,(u,v)的权c[u][v]最小,那么一定存在G的一棵最小生成树,它以(u,v)为其中一条边。这个性质有时也称为MST性质。 * MST性质证明 假设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)的最小生成树,这与假设矛盾。 * 用贪心算法设计策略可以设计出构造最小生成树的有效算法。常用的构造最小生成树的Prim算法和Kruskal算法都可以看作是应用贪心算法设计策略的例子。尽管这2个算法做贪心选择的方式不同,它们都利用了上面的最
文档评论(0)