dijkstra最短路径算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据通信与计算机网络大作业

Dijkstra

【摘要】

摘要:最短路径分析在地理信息系统、计算机网络路由等方面发挥了重要的作用, 对其进行优化很有必要。本文分析了传统

的最短路径算法(即Dijkstra 算法)的优化途径及现有的优化算法, 然后在Dijkstra 算法的基础上, 采用配对堆结构来实现路

径计算过程中优先级队列的一系列操作, 经理论分析与实验测试结果对比, 可以大大提高该算法的效率和性能。

【关键词】

最短路径; Dijkstra 算法;

【正文】

随着计算机网络技术和地理信息科学的发展, 最短路径问题无论是在交通运输, 还是在城市规划、物流管理、网络通讯等方面, 它都发挥了重要的作用。因此, 对它的研究不但具有重要的理论价值, 而且具有重要的应用价值。研究最短路径问题通常将它们抽象为图论意义下的网络问题, 问题的核心就变成了网络图中的最短路径问题。此时的最短路径不单指“纯距离”意义上的最短路径, 它可以是“经济距离”意义上的最短路径, “时间”意义上的最短路径, “网络”意义上的最短路径。关于最短路径问题, 目前所公认的最好的求解方法, 是由F.W.Dijkstra 提出的标号法, 即Dijkstra 算法。

1 Dijkstra 算法

Dijkstra 算法是求最短路径的最基本和使用最广泛的算法。在求从网络中的某一节点(源点)到其余各节点的最短路径时, 经典Dijkstra 算法将网络中的节点分成三部分: 未标记节点、临时标记节点和最短路径节点(永久标记节点)。算法开始时源点初始化为最短路径节点, 其余为未标记节点, 算法执行过程中, 每次从最短路径节点往相邻节点扩展, 非最短路径节点的相邻节点修改为临时标记节点, 判断权值是否更新后, 在所有临时标记节点中提取权值最小的节点, 修改为最短路径节点后作为下一次的扩展源, 再重复前面的步骤, 当所有节点都做过扩展源后算法结束。具体算法描述如下:

设在一非负权简单连通无向图G=(V:顶点集, E:边集, W:边权值)中, d 为图G 的邻接矩阵, 求源点P

0到其余所有节点Pi的最短路径长度。

⑴将V 分为未标记节点子集N、临时最短路径节点子集T和最短路径节点子集S, 每个节点上的路径权值为D(i)。初始化:S={P0}, T=¢, N=V- S, D(0)=0, D(i)=∞;

⑵更新:将新加入S 集合的节点Ps 作为扩展源, 计算从扩展源到相邻节点的路径值。若该值比节点上的原值小, 则用该值替换原值, 否则保持原值不变, 即D(i)=min{D(s)+d[s][i],D(i)},并将这些相邻节点之中的未标记节点归为临时标记节点, 即T= T∪Pi, N=N- Pi;

⑶选择:在T 中选择具有最小路径值D(s)的节点Ps, 归入集合S 中, 即S=S ∪Ps, T=T- Ps;

⑷迭代判断:若T=¢算法结束, 否则转⑵。

该算法总共需要迭代n- 1 次, 每次迭代都新加一个节点到临时节点集合中, 由于第i 次迭代时不在临时节点集合中的节点数为n- i, 即第i 次迭代需对n- i 个节点进行处理, 因此其所需的处理数为, 对n 个节点网络的时间复杂度是O(n2)。

2 Dijkstra 算法的优化途径及常用优化算法

在按标记法实现Dijkstra 算法的过程中, 核心步骤就是从未标记的点中选择一个权值最小的弧段。这是一个循环比较的过程, 如果不采用任何措施, 未标记点将以无序的形式存放在一个链表或数组中。那么要选择一个权值最小的弧段就必须把所有的点都扫描一遍, 在大数据量的情况下, 这无疑是一个制约计算速度的瓶颈。解决办法就是将临时标记结点按照最短路径排序, 每个搜索过程不必全部遍历或者较少地遍历临时标记点, 可大大提高算法的执行效率。这是目前各种基于Dijkstra 算法的各种优化算法的主要途径。另外, 图的结构(网络的拓扑关系)如果用一个矩阵来表示这个网络, 不但所需空间巨大, 而且效率会很低。下面将就如何用一个简洁高效的结构表示网的拓扑关系以及快速搜索技术的实现进行讨论。

在此算法思想基础上, 人们演绎出了几十种不同的优化算法。目前, 对于算法中快速搜索技术的实现, 主要有桶结构法、队列法以及堆实现法。TQQ、DKA 以及DKD 在这方面是比较典型的代表。TQQ 是用两个FIFO 的队列实现了一个双端队列结构来支持搜索过程, DKA 和DKD 是采用桶结构来支持搜索运算, 3 种算法将空间存储问题放在了一个重要的位置, 以牺牲适当的时间效率来换取空间节省。从当前计算机硬件发展水平来看, 空间存储问题已不是考虑的主要问题了, 须进行改进。

在Dijkstra 算法中, 为了获得己经计算过距离中值最小的节点, 一般采用一个可更新、可排序的优先队列来实现。如何实现Dijkstra 算法的优先队列结构, 成为提高Dijkstra 算法性能的关键。标准的优先队列仅支持“插入(Insert)”、“删除最小(Delete-Min)”两种元素操作。但使用Dijkstra 算法需要优先队列具备“降级(Decrease- Priority)”操作, 能动态调整己排序队列中的元素。选择合适的数据结构实现可降级的优先队列可以有效地降低算法复杂度, 减少算法执行时间。

为了降低优先队列的操作时间复杂度, 一般采用堆结构来实现优先队列。常见的堆结构有:采用二叉堆(binary heap)的优先队列所有操作时间都是O (logN), Dijkstra 算法的时间复杂度为O (ElogV)。Fredman 和Tarjan 提出的斐波那契堆(Fibonacciheap), 其插入时间为O(l), 降级的摊还时间为O(l), 删除最小的摊还时间为O (logN), Dijkstra 算法的时间复杂度为O (E+V1ogV), 是实现优先队列的常用选择。

3.结束语

目前各种基于Dijkstra 算法的各种优化算法的优化方法是将临时标记结点按照最短路径排序, 每个搜索过程不必全部遍历或者较少地遍历临时标记点。本文在经典Dijkstra 算法的基础上, 利用配对堆数据结构管理网络节点, 从中搜寻最短路径节点, 经理论分析与实验测试结果对比, 该方法可大大提高该算法的

相关文档
最新文档