【算法】 最短路径算法——Dijikstra算法

前言

       去年大二的时候学习了数据结构和离散数学,记得当时对各种遍历算法、最短路径、排序算法都有一定的掌握,尤其是几种经典的算法都比较熟悉,那时候还没记笔记的习惯,把算法用到具体的编程实战中的机会较少,一直在纸上谈兵。今天学习计算机网络,在通信网络中,路由器与路由器之间最短路径算法,又对这些算法感兴趣了。大二时那种觉悟还没感到数据结构和算法的有用性,(知道有用 但是不知道这么有用),现在遇到的前辈都说,于是从头再过一遍data  structure.

还是像往常一样,先从网络上找点这方面的介绍,安逸。

来源于百度百科

算法介绍

迪杰斯特拉(Dijikstra)算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。使用广度优先(BFS)搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。

算法思路

Dijikstra算法其实是贪心策略的一个应用,主要用于解决图中的最短路径问题。

算法是递归得到一个最小生成树,直到找到最终的终点即可。

主要做的事为每次选择最短的邻边进行遍历,判断,加和,递归。

首先从起始点开始,按照一定的时针顺序,遍历其到每一个顶点连线的距离,将这些距离进行列,然后选出最短的一条,到达对应的顶点,然后接着执行这个顺序,直到到达最终的点即可。

注意 1.不回溯,也就是算法不可以返回已经遍历过的点。2.将每次走的最短的边加起来就得到了总长度。

算法演示

对图的一种表示方法就是它的邻接矩阵,许多算法也都是直接基于邻接矩阵进行操作的。我们就以下面的例子为例

【算法】 最短路径算法——Dijikstra算法_第1张图片(from 杨频计网PPT Dijkstra’s algorithm: example)

这道题就是一个网络中有多个路由器的情形,目标是从U给Z发送文件,问怎么走路径最短。

这道题还加权了,我们通过邻接矩阵来表示一下。邻接矩阵是第一步 更清晰,如图

表示的方法为:如果两个点有边相连,直接填上边的权值。如果没有直接相连,填 ∞ 即可。同点之间填0

  U V W X Y Z
U 0 7 3 5
V 7 0 3 4
W 3 3 0 4 8
X 5 4 0 7 9
Y 4 8 7 0 2
Z 9 2 0

然后就开始对其进行依次遍历了,从U到Z,看着邻接矩阵 即可。

1.从与U相邻的所有边中选择最短的,不难看到是与W相连的为3。

  U V W X Y Z
U 0 7 3 5

2.记录UW,从W开始选择其最短的,路径为3

  U V W X Y Z
U 0 7 3 5
UW   / 3 0 4 8

3.从W的点开始选择最短的,到V最短,路径加3

  U V W X Y Z
U 0 7 3 5
UW   / 3 0 4 8
UWV / 0 / 4

4.类似的,到Y最短,路径加4

  U V W X Y Z
U 0 7 3 5
UW / 3 0 4 8
UWV / 0 / 4
UWVY / / / 7 0 2

5.接着发现到Z最短,也直接到了Z,即可

  U V W X Y Z
U 0 7 3 5
UW / 3 0 4 8
UWV / 0 / 4
UWVY / / / 7 0 2
UWVYZ / / / / / 0

total=3+3+4+2=12,即可求出最短路径为12.

当然这个算法做的时候还是有一些限制条件,假如说我们给U到Z之间连一条线,它的路径为11,此时,U到Z直达为11,但是按照算法做下来就是12了。

按照百度和别的一些算法提示说

按路径长度递增次序产生算法:

把顶点集合V分成两组:

(1)S:已求出的顶点的集合(初始时只含有源点V0)

(2)V-S=T:尚未确定的顶点集合

将T中顶点按递增的次序加入到S中,保证:

(1)从源点V0到S中其他各顶点的长度都不大于从V0到T中任何顶点的最短路径长度

(2)每个顶点对应一个距离值

S中顶点:从V0到此顶点的长度

T中顶点:从V0到此顶点的只包括S中顶点作中间顶点的最短路径长度

依据:可以证明V0到T中顶点Vk的,或是从V0到Vk的直接路径的权值;或是从V0经S中顶点到Vk的路径权值之和

 

其实可以理解为算法为,从源点到每个下一个顶点都是最短路径,而不是“绕”中最短。

 

就是这样,在做纸质题时较为直观可以看出,在编程时应该注意这些坑。

你可能感兴趣的:(数据结构,算法,Dijikstra算法,数据结构,贪心策略,最小生成树,最短路径)