- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* 计算机算法设计与分析 * Dijkstra 算法 Dijkstra 算法的做法是: 由近到远逐步计算,每次最近的顶点的距离就是它的最短路径长度。 然后再从这个最近者出发。即依据最近者修订到各顶点的距离,然后再选出新的最近者。 如此走下去,直到所有顶点都走到。 * 计算机算法设计与分析 * Dijkstra 算法 Procedure Dijkstra { (1) S:={1}; //初始化S (2) for i:= 2 to n do //初始化dis[] (3) dis[i] =C[1, i] ; //初始时为源到顶点i一步的距离 (4) for i :=1 to n do { (5) 从V-S中选取一个顶点u使得dis[u]最小; (6) 将u加入到S中;//将新的最近者加入S (7) for ?w∈V-S do //依据最近者u修订dis[w] (8) dis[w] := min(dis[w] , dis[u]+C[u ,w]) } } * 计算机算法设计与分析 * Dijkstra算法举例 迭代 S u dis[2] dis[3] dis[4] dis[5] 初始 {1} -- 10 ∞ 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 1 2 5 4 3 10 20 50 100 30 10 60 赋权图G 由数组dis[i]可知:从顶点1到顶点2、3、4、5的最短通路的长度分别为10、50、30和60。 * 计算机算法设计与分析 * Dijkstra算法的贪心选择性质 Dijkstra 算法中所做的贪心选择是:若u是V–S中具有最短路径的特殊顶点,就将u选入S,并确定了从源到u的最短路径长度dis[u]。 为什么从源到u没有更短的路径呢? 若有,则将如下图所示: S v dis[u] (最近距离) u x dis[x] 若该路径经S外一点x到达u,则: dis[x]+d(x, u)<dis[u]从而 dis[x]<dis[u],这与u的选取矛盾 * 计算机算法设计与分析 * Dijkstra算法的计算复杂性 Dijkstra 算法有两层循环,外层循环为n次,内层有两个循环:一个是选出最小的u(第5行),另一个是修订dis[w](第7、8行),内层循环的时间为O(n)。 因此Dijkstra算法的时间复杂度为 O(n2)。 Dijkstra 算法能求出从源到其它各顶点的最短通路的长度,但是却并没有给出其最短通路。 对Dijkstra 算法做适当的修改便可求出最短通路。 * 计算机算法设计与分析 * 旅行商问题 推销员从某城市出发,遍历n个城市最后返回出发城市。设从城市i到城市j的费用为cij,如何选择旅行路线使得该推销员此趟旅行的总费用最小? 图论语言表述:给定n个节点简单无向完全图G=V,E,c,c(i,j)是节点i到j的代价(边权)。在G中求遍历所有节点简单回路C,使C上所有边权的和最小。 * 计算机算法设计与分析 * 旅行商问题分析 1 2 3 4 5 1 ∞ 1 2 7 5 2 ∞ 4 4 3 3 ∞ 1 2 4 ∞ 3 5 ∞ 对于n个节点的旅行商问题,n个节点的任意一个圆排列都是问题的一个可能解。n个节点的圆排列有(n-1)!个,因此问题归结为在(n-1)!个回路中选取最小回路。 是否能够不用O((n-1)!)时间来求解旅行商问题? * 计算机算法设计与分析 * 旅行商问题的贪心算法 基本思想:首先设置一个集合Path和当前节点v,然后不断地用贪心选择来扩充这个集合,直至Path包含所有V中顶点。 贪心选择:如果V–Path中的顶点j是与当前节点v相邻接的顶点中边权最小的,于是就选择j(将j加入Path),并将j作为新的当前节点 。 初始化:Path中仅含有源v。 * 计算机算法设计与分析 * 最临近算法中的数据结构 图用连接矩阵W[i][j]给出,即W[i][j]为结点i到结点j的权重。 Path[]记录依次连接的城市,p记录当前到达的最后一个顶点,cost为当前路径长度。 如果节点k已经到达,则arrived[k]=true。 * 计算机算法设计与分析 * 旅行商问题的
文档评论(0)