53
Computer Education
教 改 专 栏
普里姆算法和迪克斯特拉算法的比较
对比是非常有效的学习方法。普里姆算法和迪克斯特
拉算法是数据结构中的典型算法,本文通过它们的设计和
实现的对比,展示这种方法的意义。
1 基本思想和数学描述比较
对一个连通网络即无向加权连通图,其权值总和最小
的生成树称为最小生成树。对一个有向网络和一个称为源
点的顶点,求源点到其余各顶点的最短带权路径,称为单
源最短路径。
普里姆(Prim)算法和迪克斯特拉(Dijkstra)算法分别是
求最小生成树和单源最短路径的算法,它们的基本思想和
数学描述对比见表 1 和表 2。
表 1 算法的基本思想对比
普里姆算法的基本思想 迪克斯特拉算法的基本思想是
从一个最小的连通子网开
始,逐步扩大到最小生成树。
为了具体描述这个生成步
骤,暂时引入一些名称:上
述的连通子网称为入选子
网,它最初的顶点集只包含
一个顶点,称为始点,边集
是空集。入选子网以外的顶
点组成候选集。对候选集中
的一个顶点,我们把入选子
网的顶点与该顶点的关联边
称为特殊边,该顶点对应的
最短的特殊边称为候选边。
每一个候选集的顶点都对应
一条候选边,候选边的集合
称为候选边集。在候选边集
中选择一条最短的,把终点
和边分别加到入选子网的顶
点集和边集。入选子网扩大
了,候选集缩小了,候选边
集需要更新,然后再选出最
短的,加到入选子网。依此
类推,直到入选子网的顶点
集等于连通网络的顶点集。
从一个最小的有向子网开始,逐步扩
大到由单源最短路径构成的有向子网
为止。为了具体描述这个生成步骤,
暂时引入一些名称:上述的有向子网
称为入选子网,它最初的顶点集只包
含源点,边集是空集。入选子网以外
的顶点组成候选集。一个顶点属于入
选子网当且仅当从源点到该顶点的最
短带权路径长度已知,而且中间顶点都
属于入选子网。开始时入选子网只含有
源点,从源点到源点的最短带权路径长
度是 0。对候选集中的一个顶点,我们
把从源点到该顶点且中间只经过入选
子网顶点的路径称为特殊路径,该顶点
对应的最短的带权特殊路径称为候选
路径。每一个候选集的顶点都对应一条
候选路径,候选路径的集合称为候选路
径集。在候选路径集中选择一条最短
的,把终点和路径的最后一条边分别加
到入选子网的顶点集和边集。入选子网
扩大了,候选集缩小了,候选路径集需
要更新,然后再选出最短的,加到入选
子网。依此类推,直到入选子网顶点集
等于网络顶点集。
表 2 算法的数学描述比较
普里姆算法的数学描述 迪克斯特拉算法的数学描述
设 G=(V,E)是连通网络,
V={v
0
,v
1
,…..,v
n
}。不失一般
性,设 v
0
为起始点,U 是入
选子网的顶点集,T 是入选
子网的边集。
0{};Uv
T
()while U V
{
(',')
min {min ( , )}
vVU uU
cu v
cuv
∈− ∈
=
UU
{( ', ')}TT uv=
U
{'}UU v=
U
}
设 G=(V,E)是有向网络,V={v
0
,v
1
,…..,v
n
}。
不失一般性,设 v
0
为源点,U 是入选子网的
顶点集,T 是入选子网的边集。
0{};Uv
T
()while U V≠
{
0, ,
0, ,
0, ,
'','
min {min , }
vV U v uU
cv u cuv
vucuv
∈− ∈
>+ < >=
<>+<>
L
L
L
UU
{','}TT uv
<>
U
{'}UU v=
U
}
2 步骤和图示比较
为了实现普里姆算法,首先引入一个结构 PathData 来
记录候选边信息,入选子网顶点作为始点,候选集顶点作
为终点。其实无向网络的边是不分始点和终点的,这样做
仅是为了表述方便。
PathData
始点 终点 权
start dest cost
下面以图 1(b)为例,详细介绍普里姆算法的实现步骤:
(1) 由始点 0 组成入选子网,其余顶点组成候选集。
用无色环表示入选子网的顶点,有色环表示候选集顶点,
虚线表示候选边,权 M 代表一个很大的值(这个值应该大
于该网络的所有权之和),表示对应的候选边不存在(这样
做是为了计算方便)。把候选边集存入 PathData 结构数组。
如图 1(c)所示。
(2) 在候选边集中选定一条权最小的候选边加到入选
子网(用实线表示)。快速实现的方法是将候选边集调整为