作者介绍
我是长春理工大学计算机研0小棠学姐,今天为大家带来迪杰斯特拉算法。
迪杰斯特拉算法(Dijkstra’s Algorithm),又称狄克斯特拉算法,是由荷兰计算机科学家艾兹赫尔·戴克斯特拉(Edsger Dijkstra)于1959年提出的一种用于计算图中单源最短路径的算法。该算法主要用于在有向图或无向图中找到从一个顶点到其他所有顶点的最短路径,特别适用于解决有权图(即图中每条边都有一个权值或距离)中的最短路径问题。以下是关于迪杰斯特拉算法的详细介绍:
一、算法原理
迪杰斯特拉算法采用了贪心算法的策略,其基本思想是从起点开始,逐步向外扩展,每次找到当前未访问的、距离起点最近的顶点,并更新该顶点到其他所有顶点的距离。算法过程中,会维护一个距离表(或称为优先队列),用于记录从起点到各个顶点的当前最短路径长度。
二、算法流程
-
初始化:
- 创建一个集合S,用于存放已经找到最短路径的顶点(初始时只包含起点)。
- 创建一个距离表dist,用于记录从起点到各个顶点的最短路径长度(初始时,dist[起点]=0,dist[其他顶点]=∞)。
-
循环执行:
- 在未访问的顶点中(即不在集合S中的顶点),找出距离起点最近的顶点k,将其加入集合S中。
- 更新与顶点k相邻的、且尚未加入集合S的顶点的距离。如果通过顶点k到达这些顶点的路径比原来的路径更短,则更新这些顶点的距离。
-
重复步骤2,直到所有顶点都被访问过(即所有顶点都加入了集合S)。
三、算法特点
- 贪心策略:算法在每一步都选择当前看来最好的选择(即距离起点最近的顶点),但不一定保证全局最优。然而,在解决单源最短路径问题时,贪心策略是有效的。
- 适用场景:适用于有权图(边有权值)中的单源最短路径问题。特别地,该算法要求图中不存在负权边。
- 时间复杂度:在标准实现中,迪杰斯特拉算法的时间复杂度为O(V^2),其中V是图中的顶点数。通过使用优先队列(如斐波那契堆)进行优化,时间复杂度可以降低到O((V+E)logV),其中E是图中的边数。
四、算法实例
为了给你一个具体的实例图并计算其上的最短路径,我们可以考虑一个简单的加权无向图。在这个例子中,我们将使用迪杰斯特拉算法来计算从一个指定的源点到图中所有其他顶点的最短路径。
假设我们有以下的加权无向图:
A
/ \
5 3 B
\ /
C
|\
2 | 1
D
\
E
\
4
F
在这个图中,顶点集为 V = {A, B, C, D, E, F}
,边及其权重如下:
- A 到 B 权重为 3
- A 到 C 权重为 5
- B 到 C 权重为 3(虽然图看起来是对称的,但明确写出所有边有助于理解)
- C 到 D 权重为 2
- C 到 E 权重为 1
- D 到 E 权重为 2(这条边是隐式的,因为从C到E和C到D的路径已经给出)
- E 到 F 权重为 4
注意:为了简化,我们假设没有直接从A到D、A到E、A到F、B到D、B到E、B到F、D到F的直接边,尽管在实际图中可以根据需要添加。
假设我们选择顶点A作为源点。
步骤 1: 初始化
- 集合S(已找到最短路径的顶点):
{A}
- 距离表dist(从A到各点的最短距离):
- A: 0
- B: ∞
- C: 5
- D: ∞
- E: ∞
- F: ∞
步骤 2: 迭代过程
-
选择最近顶点:当前最近的是A(距离为0),但因为它已经在S中,所以我们考虑下一个。实际上,我们从未访问的顶点中选择距离最小的,但这里为了说明,我们直接跳到下一步。
-
更新相邻顶点:
- 从A到B的距离为3,小于dist[B](∞),所以更新dist[B] = 3。
- 从A到C的距离为5,等于dist[C](5),所以不更新。
- 其他顶点尚未通过A直接连接到,因此保持不变。
将B加入S。
-
再次选择并更新(继续这个过程):
- 从B到C的距离为3(通过B比直接从A到C更短),小于dist[C](5),所以更新dist[C] = 3。
- 其他从B出发的更新可能不会影响dist表,因为我们已经有了更短的路径到C(通过A)。
继续这个过程,直到所有顶点都被添加到S中。
最终的最短路径距离表(可能因实现细节而异,但结果应相似):
- A: 0
- B: 3
- C: 3
- D: 5(通过C-D)
- E: 4(通过C-E)
- F: 8(通过C-E-F)
注意:这个计算过程是基于假设的边的存在和权重的。在实际应用中,图的表示(如邻接矩阵或邻接表)和算法的具体实现细节(如如何处理相等的距离、如何选择下一个顶点等)可能会有所不同。
五、应用实例
迪杰斯特拉算法在计算机网络路由选择、地理信息系统中的路径规划、游戏开发中的AI寻路等领域有着广泛的应用。通过计算从起点到终点的最短路径,可以帮助我们找到最优的通行方案。
学习交流
如想要报考长春理工大学计算机专业的准研究生可私我 179+234+8035
25长春理工大学计算机和人工智能专业考研