基金颁发部门:科技部国家863高技术发展研究计划项目 项目名称:混沌密码系统的理论与实现技术 编号:2006AA01Z426 申请人:王茂才作者简介:康晓军(1978-),男,讲师,博士研究生。
王茂才,男,讲师,博士研究生。
最短路径问题的一种高效实现康晓军 王茂才(中国地质大学,武汉,430074)摘要:本文通过对Dijkstra 最短路径搜索算法的分析,从数据存储结构方面对此问题进行了探讨,并提出了一种数据文件结构,实验证明该实现具有较高的效率。
关键字:网络分析 最短路径 Dijkstra分类号: TP301.6 文献标识码:AAn Efficient Implementation of Shortest Path ProblemBased on Dijkstra AlgorithmKang XiaoJun Li ShengWen(The China University of Geosciences, Wuhan, 430074)Abstract : In this paper, Author analyzes the optimization based on the Dijkstra’s shortest path algorithm form the data storage configuration. At the same time, we discuss a structure of date file. In the experiment prove the high efficiency.Key words : network analysis ; The shortest path ; Dijkstra引言:随着计算机的普及以及地理信息科学的发展,GIS 系统因其强大的功能得到日益广泛和深入的应用。
网络分析作为GIS 最主要的功能之一,在电子导航、交通旅游、城市规划以及电力、通讯等各种管网、管线的布局设计中发挥了重要的作用,而网络分析中最基本最关键的问题是最短路径问题。
最短路径不仅仅指一般地理意义上的距离最短,还可以引申到其他的度量,如时间、费用、线路容量等。
相应地,最短路径问题就成为最快路径问题、最低费用问题等。
由于最短路径问题在实际中常用于汽车导航系统以及各种应急系统等(如110报警、119火警以及医疗救护系统),这些系统一般要求计算出到出事地点的最佳路线的时间应该在1 s ~3 s 内,在行车过程中还需要实时计算出车辆前方的行驶路线,这就决定了最短路径问题的实现应该是高效率的。
其实,无论是距离最短、时间最快还是费用最低,它们的核心算法都是最短路径算法。
经典的最短路径算法——Dijkstra 算法是目前多数系统解决最短路径问题采用的理论基础,只是不同系统对Dijkstra 算法采用了不同的实现方法。
1 经典Dijkstra 算法的主要思想:设G = < V , E , A >为一个具有n 个顶点的赋值有向图,设x 0∈V 。
我们循序渐进地建立这样一个顶点集合X ,对所有x ∈X (x ∈V ),我们知道从x 0到x 的最短路径。
开始,X = { x 0 },然后每一步向X 种加入一个顶点x ,加入x 的条件是已知从x 0到x的最短路径的路程,以及在这个路程中位于x之前的顶点。
当所有从x0可到达的顶点都加入到X中时,运算结束。
设M = V – X,对于M中的顶点y,一切从x0到y的路径,如果除y以外仅含X的元素,即称之为从经x0过X到y的路径,这些路径中的最短路径的路程记为:DIS ( x0 → X → y )最短路径中位于y之前的顶点记为:PRED (x0 → X → y )如此,每一步骤我们总是向X中添加顶点m,并保证:DIS (x0 → X → m )=INF { DIS (x0 → X → y ) }y∈M也就是说总是选择距x0最近的顶点添加到X中去。
当m添加到X中以后,对于M中的顶点y,可能产生从x0到y的新的通过X的路径,在这些路径中,m = PRED(x0 → X → y ),因此可能有必要刷新DIS (x0 → X → y )。
为了对以上方法编程,我们建立一维数组DIS(DIS[i]记录DIS(x0 → X →V i),V i∈ V),一维数组PRED(PRED[i]记录PRED(x0 → X → V i))。
计算开始,DIS[i]初始化为x0与V i之间的边的长度,如果x0与V i之间无边相连,则初始化为∞(一个足够大的数值),PRED[i]初始化为x0的编号。
2 Dijkstra算法的实现:从上面可以看出,在按标记法实现Dijkstra算法的过程中,核心步骤就是从未标记的点中选择一个权值最小的弧段,。
这是一个循环比较的过程,如果不采用任何技巧,未标记点将以无序的形式存放在一个链表或数组中。
那么要选择一个权值最小的弧段就必须把所有的点都扫描一遍,在大数据量的情况下,这无疑是一个制约计算速度的瓶颈。
要解决这个问题,最有效的做法就是将这些要扫描的点按其所在边的权值进行顺序排列,这样每循环一次即可取到符合条件的点,可大大提高算法的执行效率。
另外,GIS中的数据(如道路、管网、线路等)要进行最短路径的计算,就必须首先将其按结点和边的关系抽象为图的结构,这在GIS 中称为构建网络的拓扑关系(由于这里的计算与面无关,所以拓扑关系中只记录了线与结点的关系而无线与面的关系,是不完备的拓扑关系)。
如果用一个矩阵来表示这个网络,不但所需空间巨大,而且效率会很低。
下面主要就如何用一个简洁高效的结构表示网的拓扑关系以及快速搜索技术的实现进行讨论。
网络在数学和计算机领域中被抽象为图,所以其基础是图的存储表示。
一般而言,无向图可以用邻接矩阵和邻接多重表来表示,而有向图则可以用邻接表和十字链表表示,其优缺点的比较见表1。
表 1 几种图的存储结构的比较名 称 实现方法 优 点 缺 点时间复杂度邻接矩阵 二维数组 1. 易判断两点间的关系2. 容易求得顶点的度占用空间大 O(n2+m*n)邻接表 链表 1. 节省空间2. 易得到顶点的出度1. 不易判断两点间的关系2. 不易得到顶点的入度O(n+m)或O(n*m)十字链表 链表 1. 空间要求较小2.易求得顶点的出度和入度结构较复杂 同邻接表邻接多重表 链表 1. 节省空间2. 易判断两点间的关系结构较复杂 同邻接表3 图的节点-弧段联合结构表示法节点、弧段结构是G1S表达地图的一种常用数据结构。
在该结构中,一幅图可抽象为“{节点集合}+{弧段集合}”。
对于每条弧段,记录了其起始节点、终止节点编号,以及弧段权值(可描述弧段各种属性信}l);而对于每个属于节点集的点,其数据项包括:点的地理坐标、关联弧段数、关联弧段的编号,及节点的属性,如节点是否为阻挡点、节点处的费用、是否为图的割点等。
下面为C语言描述的节点及弧段数据结构及网络图结构:struct Arc(弧结构){int ArcNo; //弧编号int start_pt_no; //起始点编号int end_pt_no; //终止点编号float attribl_value; //弧的属性1的数值float attrih2_value; //弧的属性2的数值flat attrihn_ value; //弧的属性n的数值};struct Point(点结构){int PointNo; //节点编号float x,y; //地理坐标int NearArcNum; //关联弧数量int NearArcNo; //各关联弧的编号float attrihl_value; //节点属性1的数值float attrih2_value; //节点属性2的数值flat attrihn_value //节点n属性n的数值};struct Network (网络图结构){int pointNum, archNum; //图的节点、弧段数量Point *points; //该图包含的节点集Arc *arcs; //该图包含的弧段集};利用上而的节点弧段联合结构,可以较好地表达一幅真实图件中的实体关系。
4存储结构的改进:在深入分析了Dijkstra算法后,基于上述节点-弧段结构,我们提出了如下的数据结构:开辟几个一维数组来存储如弧段长度,弧段的起点,终点等信息,全部按照点号的次序排列。
另外对于最关键的邻接点的问题我们设置一个一维数组ArcBase来解决,数组下标对应顶点点号,数组内容为该顶点在弧段文件中的起始位置。
这样一来相应的顶点I的出度就可以用ArcBase[I+1]—ArcBase[I]来求得,再通过弧段起点数组和弧段终点数组的对应关系就可以求得各顶点的邻接点了。
使用这种方法,我们使得空间复杂度由(n2 )变为(n),而且也非常方便。
另外在每次的搜索最短弧长DIS的时候,我们对所有更新过的DIS数据进行排序,这里使用了快速排序法,也大大提高了系统的整体效率。
在仿真实验中本算法收到了很好的效果。
表2 本文提出的算法数据文件结构文件结构内容类型长度(字节)Int 4 点数N 文件中共有的结点数目 Long结点信息X坐标,Y坐标 Double,Double N*16Int 4 弧段数M 文件中共有的弧段数目 Long弧段信息起点点号,终点点号,弧长 LongInt,Long Int,Double M*165 结论利用节点弧段联合结构表达图,采用适当的搜索方法,应用到最优路径的选取上,这在GIS网络分析中比较实用。
它避免使用大规模数组,降低了存储结构的冗余度,还能有效地表示比较复杂的图,以及具有多重属性的节点与弧段,从而为实现多目标搜索提供基础。
此外,由于当前G1S软件的数据源普遍采用ARC/1NFO的Cover-Age,而本方法中采用的数据结构可以很容易地从ARC/1NFO数据的拓扑结构获得并扩充得到,可见这在G1S应用中也是非常实际的。
本文作者创新点:本文通过对Dijkstra最短路径搜索算法的分析,提出了一种数据文件结构,实验证明其实现是高效的。
参考文献:[1] 乐阳,龚健雅. Dijkstra 最短路径算法的一种高效率实现[J].武汉测绘科技大学学报,1999; 24(3): 209-212.[2] 徐业昌,李树祥,朱建民等.基于地理信息系统的最短路径搜索算法[J].中国图象图形学报, 1998; 3 (1) : 39~ 43.[3] 王志和,凌云.Dijkstra最短路径算法的优化及其实现[J] ,微计算机信息,2007,11-3:275-277[4] 严蔚敏,吴伟民.数据结构.北京:清华大学出版社,1997.[5] 严寒冰,刘迎春.基于GIS城市道路网最短路径算法探讨,[J].计算机学报,2000, 23(2) : 210一215.[6] 吴京,景宁,陈宏盛最佳路径的层次编码及查询算法,[J].计算机学报,2000,23(2)[7] 王开义,赵春江GIS领域最短路径搜索问题的一种高效实现[J]. 中国图象图形学报,2003,8[8] 陆峰最短路径算法:分类体系与研究进展,[J]测绘学报,2001,8作者简介:康晓军(1978-),男,内蒙古呼和浩特人,中国地质大学计算机学院讲师,博士生。