最短路径算法效率研究
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
该算法的基本思想: 首先建堆 , 把临时标号节点 插入堆中 , 根据堆顶节点标号值取最小的原则 , 将当 前节点标号值与堆顶节点标号值进行比较, 调整位 置, 使之成为堆。其次重建堆 , 将拥有最小标号值的 临时标号节点的从堆顶删除, 使之变为永久标号节 点, 用其余的临时标号节点重建堆。重建堆的过程 : 删除堆顶临时标号节点后, 以堆中最后一个临时标 号节点替代之, 然后从上到下进行调整 , 使剩余节点 成为堆。当堆 中临时标号节点 的标号值发生 变化 时, 用该节点的新的标 号值替换旧的 , 然后进 行调 整, 使之重新成为堆。该算法最终生成的不仅是源 点到终点的最短路径, 而且还得到源点到网络中其 他节点的最短路径 , 实际上生成的是其他节点到源 点的最短路径树。 无序结构的 Dijkst ra 算法要顺序遍历整个最短 路径树。采用二叉堆结构的 Dijkst ra 算法仅需遍历 二叉堆, 即仅遍历最短路径树中从根节点到当前进行 操作的节点 , 即遍历次数仅仅是二叉堆的高度 log n, 故算法的执行效率大为提高, 整个算法的时间复杂度 为 O( m log n)
k 2i k 2i+ 1
或
ki ki
k2 i k 2 i+ 1
n 2 - 。二叉堆结构如图 2 所示。
图 2 二叉堆的示例 Fig. 2 Example of heap structure
int co unt; int pr eNodes[ No des+ 1] ; } source; int Pf lag; } 实现基于桶结构的 Dijkstra 算法 , 根据桶结构 的原理 , 在程序中定义一个桶的结构 Bucket , 使用 变量 Bucket - count 保 存桶 的个 数, 变量 Bucketlengt h 保存桶的长度 , 变量 m in- pos 保存有数字的 最小桶号。设计了函数 init - Bucket ( ) 初始化桶 , 函 数 Rem ove( int node - num, int pos) 删除桶 中的节 点 , 函数 Insert ( int node- num, int po s, flo at value) 完成向桶中插入节点的操作。 str uct Bucket { / / int m in- pos; int co unt [ Bucket- count ] ; / / 桶中保存的数字 个数 str uct node * f ir st [ Bucket- count ] ; / / 桶的头 指针 } 实现基于堆结构的 Dijkstra 算法 , 根据堆结构 的原理 , 在程序中定义了一个结构 no de2 存放堆的 信息 , 设 计了函 数 priqueue ( ) 初始 化堆 , 函 数 in sert queue( int index , f loat value) 完成插入堆操作, / / 前一节点 / / 永久标号标志 : 1 为永久标号 , 0 为临时标号
Research into the Efficiency of the Shortest Path Problem Algorithm
Ning Jianhong ( Scho ol of Elect ronic Inf ormat ion, Shang hai Dianji U niversit y, Shang hai, 200240) Abstract F or t he sam e algo rithm, three diff erent st orage st ruct ures, o ut -of - order st ruct ure, bucket st ruct ure and heap st ructure, are adopted t o save temporary label no des. A ft er co mparison and analy sis, t he eff iciency of Dijkst ra alg orit hm , based on heap st ruct ure, is higher t han t he ot hert w o and is especially adapt able to larg e - scale net w orks. Key words short est pat h pr oblem algo rithm; sto rage str ucture; ef ficiency
源自文库Fig. 1
图 1 桶结构示意图 Diagrammatic sketch of bucket structure
该算法明 显地提高了永久标号节 点的搜索速 度 , 对于路径长度的精度要求不高, 内存资源丰富的 条件下是很好的选择。但是 , 该算法十分消耗内存, 当路径长度的表示精度选取不合适, 桶的数值范围选 取不合理时, 会产生大量的空桶, 造成资源浪费。另 外, 桶数值范围的选取需要对整个网络路径值的范围 有全面的了解, 否则会造成整个算法性能的下降。 1. 3 基于堆结构的 Dijkstra 算法 采用堆结构存储临时标号节点 , 也能加快算法 的搜索速度。 Willio ms 在 1964 年提出了堆排序方 法 , 该方法引入了堆这种特定的数据结构 , 二叉堆结
文章编号
1671 - 2730( 2006) 03 - 0038 - 05
最短路径算法效率研究
宁建红
( 上海电机学院 电子信息学院, 上海, 200240)
摘 要 从经典的最短路径算法 Dijkstra 算法入手 , 针对同一算法 , 分别采用三种不同的存储结
构存储临时标号节点, 通过对无序结构 、 桶结构 、 堆结构存储的分析与比较 , 提出基于堆结构的 Dijkstr a 算法的效率高于其他两种算法, 特别适合于大规模网络。 关键词 最短路径算法 ; 存储结构; 效率 T P 301. 6 文献标识码 A 中图分类号
问题 , 如带约束条件多权最短路径、 受节点数约束最 短路径问题等 [ 1] 。经典的最短路径算法 Dijkstra 算法是目前多数系统解决最短路径问题采用的理论 基础 , 不同的系统根据实际情况对 Dijkst ra 算法采 用了不同的实现方法。目前提出的最短路径算法有 很多种, 采用不同的算法 , 效率是不同的。即使是同 一算法, 实现方法不同, 效率也是不同的。 1959 年狄克斯拉提出了 Dijkst ra 算法, 也称为 最短路径算法或正向搜索算法 , 是一种集中式的静 态算法。按照路径长度增加的顺序寻找路径, 可以 找到从指定的一个源点到所有 其他节点的最 短路 径。算法的基本思想是 : 对网络中的每一节点赋 予临时标号( 源点除外 ) , 在迭代过程中不断更新这 些标号。每一步 , 节点的临时标号表示从源点到该 点的最短路径长度的上界。开始 , 所有节点的标号 都是临时标号, 每次迭代 , 从所有的临时标号中选取 最小的, 把它变成永久标号, 然后重新计算拥有临时 标号的各节点的临时标号, 得到永久标号的节点就 找到了源点到该节点的最短路径。 1. 1 基于无序结构的 Dijkstra 算法 无序结构的 Dijkst ra 算法将网络中的节点分成 两部分, 一部分是临时标号节点, 一部分是永久标号 节点。在实现算法的过程中, 关键步骤就是从临时 标号节点中选择距源点路径长度最短的节点作为永 久标号节点。这是一个循环比较过程, 在无序结构 的 Dijkst ra 算法中 , 临时标号节点以无序的形式存 放在一个链表或数组中。 该算法总共需要迭代 n- 1 次 , 每次迭代都新加 一个节点到临时节点集合中 , 由于第 i 次迭代时不 在临时节点集合中的节点数为 n - i, 即第 i 次迭代 需对 n - i 个节点进行处理 , 因此其所需的处理数为 ( n- i ) = n( n- 1) , 对 n 个节点网络的时间复 2 i= 1 2 [ 3] 杂度是 O( n ) , 但此算法只适用于边长为非负的 网络。该算法在存储临时标号节点时, 不需要复杂 的排序, 直接将节点按先后顺序存放在相应的数据 结构中, 但是选择一个标号值最小的临时标号节点 , 必须把所有的临时标号节点都扫描一遍。在数据量 大的情况下 , 必然会影响计算速度。解决该问题最 有效的方法就是把这些要扫描的节点按临时标号值 进行排序 , 每循环一次就可取到符合条件的节点, 这 样可以大大提高算法的执行效率。目前, 对于算法
从某种意义上说, 现代社会是一个由计算机信 息网络、 电话通信网络、 运输服务网络、 能源和物质 分派网络等各种网络所组成的一个错综复杂的网络 系统。而网络分析中最基本最关键的问题就是最短 路径问题。最短路径问题不仅仅指一般地理意义上 的距离最短, 还可以引申到其他的度量, 如时间、 费 用、 线路容量等。例如, 城市交通中出行者选择出行 路径 , 通信网中的最可靠路、 最大容量路问题, 统筹 方法中关键路线问题等, 都可以转化为最短路径问 题。鉴于最短路径问题应用前景的广泛, 研究它的
收稿日期 : 2006 - 02 - 23 基金项目 : 上海高校选拔培养优秀青年教师科 研专项基金。 作者简介 : 宁建红 ( 1974 -) , 女 , 讲师 , 专 业方向 : 计算机应用。
意义变得尤为重要。
1
最短路径算法分析
到目前为止 , 国内外大量专家学者对此问题进
行了深入研究。经典的图论与不断发展完善的计算 机数据结构及算法的有效结合使得新的最短路径算 法不断涌现。按照起点、 终点及路径的数目和特征, 最短路径问题可分为: 单源最短路径、 所有节点间最 短路径、 K 条最 短路径、 指定必经节点 的最短路径 问题等。其中又可衍生出其他一些特殊的最短路径
n- 1 [ 2]
中快速搜索技术的实现 , 主要有桶结构法、 队列法以 及堆栈等方法。 1. 2 基于桶结构的 Dijkstra 算法 采用桶结构存储临时标号节点 , 并对其进行排 序 , 是一种有效的优化方法。桶结构如图 1 所示 , 设 C 为网 络 中路 径 长 度 的最 大 值。该 算 法 的思 想 是[ 4 ] : 设定参数 b, b 是根据网络中边的权值分布情 况而定的一个常数。用 C/ ( b + 1 ) 个桶来存储临时 标号节点, 将临时标号节点落入不同的桶中, 其中临 时标号节点的标号值在 [ i b, ( i + 1) b - 1] 范围内的 存储在第 i 号桶中 , 每个桶中都有一个先入先出的 优先级队列 ( F IFO ) 来保存临时标号节点。用一个 游标记录最小的非空桶号, 每次找到最小的非空桶, 删除桶中队列的头节点 , 把该临时标号节点变成永 久标号节点。这样每个点可能被多次扫描 , 但最多 不会超过 b 次。最坏情况下, 算法的时间复杂度是 O( mb+ n( b + C/ b) ) [ 5] , 其中 m 为边数 , n 为节点数。
构可以看作是一棵完全二叉树 , 其含义表明: 完全二 叉树中所有非终端节点的值均不大于( 或不小于) 其 左右孩子节点的值。二叉堆定义如下: n 个 元素的 序列 { k 1 , k 2 , 二叉堆 , k n } , 当且满足下列关系时 , 称之为 ki ki 其中 i = 1, 2, ,
-
同的网络中 , 罗列出节点数和连接节点的边数。然后 分别编程实现了无序结构的 Dijkst ra 算法、 基于桶结 构的 Dijkstra 算法、 基于堆结构的 Dijkst ra 算法。 2. 1 算法实现 实现无序结构的 Dijkstr a 算法 , 首先运用程序 生成随机网络环境 ( 即图) , 图的信息存放在 config. t x t 文件中, 然后读取图的信息, 把图的信息放到邻 接矩阵 M atr ix [ No des+ 1] [ No des+ 1] 中 , 最短路径 存放在数组 Pk [ N odes + 1] [ N odes + 1] 中 , 其中 Nodes 表示节点数。定义一个结构 T i 保存节点的 标号信息。 str uct T i { f loat value; / / 节点的值 str uct sur {