- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
几种最短路径的算法及比较*
刘文海1 徐荣聪2
(1 福建对外经济贸易职业技术学院 福建 福州 350016)
(2 福州大学数学与计算机科学学院 福建 福州 350002)
【摘要】 最短路径问题是图论中一个非常有实际意义的问题,在实际生活中的各种规划设计问题中及数据挖掘中都有重要的作用。本文着重介绍了用计算机编程语言实现单源最短路径算法与每对结点间的最短路径算法,并作了简单比较。
【关键字】Relax Dijkstra Bellman 有向无环图上的最短路 Floyd-Warshall Johnson
1 引言
为了方便我们对最短路径问题的研究,下面给出其定义。
定义:在最短路径问题中,给出的是一张有向加权图,在其上定义的加权函数为边到实型权值的映射。路径的权指的是其组成边的所有权值之和:
定义从到的最短路径的权为:
2 单源最短路径算法
单源最短路径问题所求的是:从某结点s到其它所有结点的最短路径。这是最短路径问题的基础问题,其它的最短路径问题都可以转化为单源最短路径问题进行求解。
2.1 松弛技术(Relax)[]
在每个单源最短路径算法中都运用了松弛技术。松弛一条边就是试图找到一条比当前已知路径更短的边。对每一结点,我们用来表示从源到当前已知的最短路径的权的上界,称之为最短路径估计。用来表示当前最短路径估计中前面的点。
我们用如下的过程进行初始化:
伪代码:
procedure Initialize(s: Integer);
begin
for 每个定点v属于V[G] do
begin
d[v] := 无穷大;
pre[v] := 0;
end;
d[s] := 0;
end;
松弛一条边的过程包括测试我们是否可能通过结点对迄今找出的到的最短路径估计进行改进,如果可能则更新和,下列代码实现了对的一次松弛操作:
伪代码:
procedure Relax(u, v: Integer);
begin
if d[v] d[u] + w(u, v) then
begin
d[v] := d[u] + w(u, v);
pre[v] := u;
end;
end;
注意:单源最短路径的每个算法都要先调用初始化(Initialize)过程,然后重复松弛过程。
2.2 Dijkstra算法[]
Dijkstra算法解决了有向加权图的最短路径问题,它可以解决单源最短路径问题,如果以每个点作为源都做一次Dijkstra算法,则可以求出每对结点间的最短路径。该算法的条件是所有边的权值都非负,这个重要的条件使得我们用贪心得到该算法。
2.2.1算法描述
设置一结点集合,从源到集合中所有点的最短路径均已求出。算法反复挑选出最短路径估计为最小的结点加入集合,并对所有离开结点的边进行松弛操作,直到所有结点进入集合。
伪代码:
procedure Dijkstra(s, t: integer);
begin
Initialize(s);
while not D[T] in S do
begin
u := 未被加入集合S的结点中估计最短路径最小的点;//DeleteMin
S := S + u;
for v := 1 to N do
if not (v in S) then
Relax(u, v);//DecreaseKey
end;
end;
2.2.2 算法分析
这里的要用优先队列实现,需用到删除最小(DeleteMin)与减值(DecreaseKey)的操作。假设用普通的队列实现则算法复杂度为。
2.2.3 算法优化
Dijkstra使用的数据结构需要不断更新或插入储存的值,同时能够取得最小值。堆是满足以上要求且不会退化的较好数据结构。
堆,是一种特殊的森林,对于森林中的所有非叶结点,它的子结点必然比它大。树根层是无序的并有指针min[H]指向最小的根结点(同时也是堆中最小结点)。堆支持的操作有:
① 插入(Insert):把待插入结点插入树根层一端,标记为空,复杂度O(1)
② 取最值(Extarct-Min):取min[H]指向的结点,将其子结点插入树根层一端,之后进行整理,不断合并根结点度数相同的树(根的值较小的作为父亲,清除合并进来的结点标记)直到没有两个根结点度数相同,复杂度O(lg n)。
③ 修改(Decrease-key):减少结点值后移动(cut)到树根层一端,若父结点已标记继续移动,移动后清除自身标记,否则打上标记,循环直到已达到树根层或父结点原先没有标记,复杂度O(1)。
④ 删除(Delete):将待删除
文档评论(0)