单源最短路问题高效算法探究.docVIP

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
单源最短路问题高效算法探究   摘要:单源最短路问题是算法研究中由来已久的一个问题,在算法领域早期已经得到了较好的解决,但是在应用计算机语言实现的过程中往往不够优化,导致较高的时间复杂度和空间复杂度。从原始的迪杰斯特拉算法入手,进行透彻分析,在算法思想和实现方式上提出一种全面优化的算法方案,并给出了核心代码。实现过程中使用了堆的数据结构,并在具体的实现过程中进行灵活的优化。经过理论的算法复杂度分析,以及实际的数据测试,都证明全新优化后地单源最短路算法计算耗时非常少,空间复杂度也得到很大程度的降低,应用价值更强。   关键词:最短路;迪杰斯特拉;数据结构;标准模板库;优化算法   中图分类号:TP312 文献标识码: A文章编号:1009-3044(2009)13-3439-04      1 引言   最短路问题是一个经典问题,过程涉及算法设计、数据结构、运筹学、图论等多方面的知识,有很深远的理论研究意义,并在许多学科中有重要应用。在实际生活以及工程实际应用中,最短路问题的求解算法也尤为重要,例如交通路线的选择、公用设施的地点布局、管道线路的安排、智能机器人的路线选择、最短时间规划等等。   实际问题中又以单源最短路问题居多,解决单源最短路问题有比较优秀的迪杰斯特拉算法,著名的E.W.Dijkstra在1959年提出该算法,是图论中求解最短路问题的一个经典算法。由单源最短路问题可以引申出更多类似的问题,比如时间规划问题、成本预算问题、收益最大化问题等,这些与最短路同构的问题,往往可以应用Dijkstra算法得到满意的结果。   随着计算机技术的发展,绝大多数算法问题已经转变为在计算机平台上实现,其中又以使用计算机程序处理为主。在计算机编程实现的过程中,程序往往不够优化,达不到令人满意的结果,效率瓶颈突出。本文通过分析Dijkstra算法的本质,透彻分析计算机语言的特点,加之合理的数据结构,并使用C++语言实现优化的Dijkstra算法,达到了一般意义下的时间复杂度和空间复杂度的下限。      2迪杰斯特拉算法   2.1 迪杰斯特拉算法基本思想   单源最短路问题是指在一个有权的图中求出源点到其他所有点的最短路径,而Dijkstra算法是解决单源最短路问题的有效算法,在图中不存在负环(即一条从源点到源点不经过重复的边并且权值之和为负的路径)的情况下,可以得到正确的结果。其基本思想是算法中的贪心思想:每次找到一条最短的未知路径,然后用该路径更新其他未知路径的最短距离,直到不存在未知路径为止。   2.2 迪杰斯特拉算法数学描述   步骤如下:   图G=(V,E),其中V为点的集合,E为边的集合,源点为src,已经求得最短路的目的点集设为S, 源点到点i的距离d[i]   1)?坌(src,i)∈E,置d[i] = V(src, i)   2)?坌(src,i)?埸E,置d[i] =∞   3)d[src] = 0;   4)?埚j∈V,j?埸S,使得d[j]=min{d[x]},x∈V,x?埸S   5)S=S+{j}   6)?坌i∈V,i?埸S,置d[i]=min{d[i],d[j]+weight(j,i)}   7)若|S|≠|V|,转至2)   8)结束   2.3 迪杰斯特拉算法复杂度分析   分析2.2的数学描述,算法的时间消耗主要在循环上,而每次循环耗费时间的就是步骤4),即找未探索点中的最近点。设n=|V|,即n表示图中顶点的个数;m = |E|,即m表示图中边的条数。则最多循环n次,因为每次循环将使得S中的点数增加一个;同时,每次循环中找最近点的过程需要找n次,因为总共有n个点。综合考虑后,传统迪杰斯特拉算法的时间复杂度为O(n2)。空间消耗主要在图的存储上,如果采用邻接矩阵表示图,则空间复杂度为O(n2)。      3 算法优化探究   3.1 使用链表优化   从上面的分析可以得到空间复杂度为O(n2)的算法,似乎空间复杂度不是很高,然而对于顶点很多,而边却很少的稀疏图,用邻接矩阵表示的图在空间利用率上会相当低。因此,我们考虑到了使用基于链表的邻接表来表示图,从而将空间复杂度从O(n2)转变为O(m),对于处理稀疏图,有很大优势。   在访问图中的边时,若采用邻接表,则访问的次数也会有所降低,这是因为用邻接矩阵表示图的时候,对于边的访问,必须从一个顶点循环枚举到所有顶点的边,然而由于图的稀疏性,一个点所连接的边可能很少,甚至出度为0,此时用邻接表就要明显优于邻接矩阵表示的图。   3.2 使用静态内存的链表优化   链表具有灵活和高效的特点,然而的实际应用过程中往往不那么容易。一方面是因为早期的C语言不具有链表数据结构,必须自己手动编写链

文档评论(0)

yingzhiguo + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:5243141323000000

1亿VIP精品文档

相关文档