1.图
1.1 拓扑排序
拓扑排序是一种对有向无环图(DAG)进行排序的算法,它会生成一个线性序列,在这个序列中,对于图中的每条边 (u, v),顶点 u 在序列中都排在顶点 v 之前。
2.最小生成树
2.1 Kruskal
Kruskal算法是一种用于求解无向图最小生成树的贪心算法,它可以找到连接图中所有顶点的边集,使得边的总权重最小。
算法步骤:
-
初始化:
- 将所有边按照权重从小到大排序。
- 创建一个集合
U
,初始为空,用于存储最小生成树中的边。 - 创建一个集合
V
,用于存储图中的所有顶点。
-
循环执行以下步骤,直到
U
中的边数等于V
中的顶点数减 1:- 从排序后的边集中选择权重最小的边
e
。 - 如果
e
的两个端点不在同一个连通分量中,则将e
加入到U
中,并将e
的两个端点所在的连通分量合并。
- 从排序后的边集中选择权重最小的边
-
输出: 最小生成树中的边集
U
。
2.2 Prim
Prim 算法是一种用于求解无向图最小生成树的贪心算法,它可以找到连接图中所有顶点的边集,使得边的总权重最小。
算法步骤:
-
初始化:
- 选择图中任意一个顶点作为起始顶点,将其加入到最小生成树中。
- 创建一个集合
U
,用于存储已经加入最小生成树的顶点。 - 创建一个集合
V
,用于存储未加入最小生成树的顶点。
-
循环执行以下步骤,直到
V
为空:- 从
V
中选择与U
中的顶点距离最近的顶点v
。 - 将
v
加入到U
中。 - 更新
V
中所有顶点到U
的距离。
- 从
-
输出: 最小生成树中的边集。
3.最短路径
3.1 Dijkstra
Dijkstra 算法是一种用于求解单源最短路径问题的贪心算法,它可以找到从图中一个指定的源顶点到所有其他顶点的最短路径。
算法步骤:
-
初始化:
- 将所有顶点的距离初始化为无穷大,并将源顶点的距离初始化为 0。
- 创建一个集合
S
,用于存储已经确定最短路径的顶点,初始为空。 - 创建一个集合
Q
,用于存储尚未确定最短路径的顶点,初始包含所有顶点。
-
循环执行以下步骤,直到
Q
为空:- 从
Q
中选择距离源顶点最近的顶点u
。 - 将
u
加入到S
中。 - 更新
Q
中所有与u
相邻的顶点v
的距离,如果通过u
到v
的距离更短,则更新v
的距离。
- 从
-
输出: 从源顶点到所有其他顶点的最短路径长度。
3.2 Floyd
-
邻接矩阵(graph): 用于存储图的边权重,
graph[i][j]
表示从节点i
到节点j
的边的权重。如果不存在边,则权重为无穷大(表示不可达)。 -
距离矩阵(dist): 用于存储当前已知的任意两点之间的最短路径长度,
dist[i][j]
表示从节点i
到节点j
的最短路径长度。初始时,dist[i][j]
等于graph[i][j]
,且dist[i][i] = 0
(节点到自身的距离为0)。
算法步骤
-
初始化:
- 将距离矩阵
dist
初始化为邻接矩阵graph
的值。 - 对于所有节点
i
,设置dist[i][i] = 0
。
- 将距离矩阵
-
动态规划更新最短路径:
- 逐一考虑每个节点
k
作为中间节点,对所有的节点对(i, j)
,更新dist[i][j]
。 - 更新公式为:
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
,即通过节点k
经过的路径是否比当前已知的i
到j
的路径更短。
- 逐一考虑每个节点
2.算法
2.1 时间复杂度
(1)对于存取操作
线性表的顺序存储结构,对于存取操作,其时间复杂度为
因为元素位置可以直接计算得到
(2)对于插入和删除操作
对于插入和删除操作,其时间复杂度为
因为插入或删除后,需要移动其余元素