几种最短路径算法简介(一)

1.Bellman-Ford算法:

Bellman-Ford算法基于一个直观上很容易理解的原理:如果节点A的每个相邻节点知道节点Z的最短路径,那么节点A计算经过它的每个相邻节点到节点Z的距离,就能够确定到节点Z的最短路径。

几种最短路径算法简介(一)_第1张图片

如图,应用Bellman-Ford算法来计算每个节点到节点6的最短路径,以及此最短路径的下一个节点。每个节点维护着一个表项(n,Di),其中n是此最短路径经过的下一个节点,Di是到目的节点的距离。算法执行过程如下:

迭代 节点1 节点2 节点3 节点4 节点5
初始 (-1,∞) (-1,∞) (-1,∞) (-1,∞) (-1,∞)
1 (-1,∞) (-1,∞) (6,1) (-1,∞) (6,2)
2 (3,3) (5,6) (6,1) (3,3) (6,2)
3 (3,3) (4,4) (6,1) (3,3) (6,2)
4 (3,3) (4,4) (6,1) (3,3) (6,2)
1)初始时,除了节点6知道到自身的距离为0外,其余节点均不知道下一个节点以及到目的节点6的距离,故初始值均为(-1,∞)。

2)第1次迭代,节点6的相邻节点3和5发现其相邻节点到目的节点6的最短路径,故更新节点3和节点5的表项,其余仍为(-1,∞)。

3)第2次迭代,节点1发现其相邻节点3到目的节点的距离为3,故更新其自身表项为(3,3),注意节点4发现其两个相邻节点都有到目的节点的最短路径信息,经过比较选择经过节点3的路径。其余节点同理检查更新。

4)第3次迭代,节点2发现经过节点4到目的节点的路径更短,故更新其表项,其余节点同理。

5)第4次迭代,没有节点更新,算法结束。

因此我们将Bellman-Ford算法总结如下:

1)初始化:除了目的节点,其余节点表项均为(-1,∞)。

2)检查更新:各节点检查其相邻节点表项,如果经过其相邻节点到目的节点的距离小于其当前表项里的Di,则更新表项。

3)重复步骤2),直至节点表项均不变化。


2.Dijkstra算法:

Dijkstra算法是一种查找从源节点到其它所有节点最短路径的算法。该算法维护一个节点集合N,N由那些已经确定的到源节点最近的节点组成。在每次迭代中,把离源节点最近的节点加入N,并计算通过该节点到其余节点的距离。

几种最短路径算法简介(一)_第2张图片

我们仍以上图为例看一下Dijkstra算法的执行过程:

迭代 N D2 D3 D4 D5 D6
初始化 {1} 3 2 5
1 {1,3} 3 2 4 3
2 {1,2,3} 3 2 4 7 3
3 {1,2,3,6} 3 2 4 5 3
4 {1,2,3,4,6} 3 2 4 5 3
5 {1,2,3,4,5,6} 3 2 3 5 3

1)初始化:将源节点1加入集合N,与源节点1相邻的节点初始值为到节点1的距离,其余节点初始值为∞。

2)第1次迭代:检查不在集合N的其余节点到源节点1的最短路径,选择距离最小的那个节点,加入集合N,这里选择节点3。计算通过节点3到源节点的最短路径,若比当前值小,更新最短路径,这里节点4通过节点3到源节点的最短路径为4,你原来小,故更新。同理,节点6也更新。

3)第2次迭代:重复上述过程,这里节点2和节点6到源节点最短距离相等,随机选择一个加入N,这里选择节点2.。更新其余节点。

4)第3次迭代:重复上述过程,将节点6加入N,更新其余节点。

5)第4次迭代:重复上述过程,将节点4加入N,更新其余节点。

6)第5次迭代:将节点5加入集合N,完成算法。

因此,我们将Dijkstra算法总结如下:

1)初始化:将源节点加入集合N,与源节点相邻的节点初始值为到节点的距离,其余节点初始值为∞。

2)检查不在集合N的其余节点到源节点的最短路径,选择距离最小的那个节点,加入集合N,计算其余节点通过该节点到源节点的最短路径,若比当前距离小,则更新。

3)重复步骤2),直至所有节点都在集合N中。

你可能感兴趣的:(算法与数据结构菜鸟笔记)