跟着左神学算法——数据结构与算法学习日记(七)
2023-09-17 07:28:29
跟着左神学算法——数据结构与算法学习日记(七)
图论是计算机科学中的一个重要分支,它研究图这种数据结构及其算法。图在现实生活中有很多应用,如社交网络、交通网络、电路网络等。学习图论可以帮助我们更好地理解这些应用,并开发出高效的算法来解决与图相关的问题。
本文将介绍图的基本定义和表达方式,以及图的广度优先遍历、深度优先遍历、拓扑排序算法,针对于无向图的Kruskal算法、Prim算法,求权值最短路径的Dijkstra算法等算法的原理与应用。
图的基本定义和表达方式
图由顶点和边组成。顶点是图的基本组成单位,它可以表示一个对象或一个事件。边是连接两个顶点的线段,它可以表示两个顶点之间的关系或交互。
图的表达方式有很多种,其中最常见的是邻接矩阵和邻接表。邻接矩阵是一个二维数组,其中每个元素表示两个顶点之间的边的权重。邻接表是一个由链表组成的数组,其中每个链表表示一个顶点的邻接顶点。
图的广度优先遍历
广度优先遍历是一种图的遍历算法。该算法从一个起始顶点出发,依次访问该顶点的所有邻接顶点,然后依次访问这些顶点的邻接顶点,以此类推,直到遍历完整个图。
广度优先遍历的算法步骤如下:
- 选择一个起始顶点。
- 将起始顶点放入队列中。
- 循环执行以下步骤,直到队列为空:
- 从队列中取出队首顶点。
- 将该顶点标记为已访问。
- 将该顶点的所有邻接顶点放入队列中。
广度优先遍历可以用来解决许多问题,如连通性检测、最短路径查找、最小生成树查找等。
图的深度优先遍历
深度优先遍历是一种图的遍历算法。该算法从一个起始顶点出发,沿着一条路径一直向下遍历,直到遇到一个死胡同,然后回溯到上一个分岔点,继续遍历另一条路径。
深度优先遍历的算法步骤如下:
- 选择一个起始顶点。
- 将起始顶点放入栈中。
- 循环执行以下步骤,直到栈为空:
- 从栈中弹出栈顶顶点。
- 将该顶点标记为已访问。
- 将该顶点的所有邻接顶点放入栈中。
深度优先遍历可以用来解决许多问题,如连通性检测、环检测、拓扑排序等。
拓扑排序算法
拓扑排序算法是一种针对有向无环图(DAG)的排序算法。该算法将DAG中的顶点按其依赖关系排序,即如果顶点A依赖于顶点B,则顶点A在顶点B之后排序。
拓扑排序算法的算法步骤如下:
- 将所有顶点放入一个队列中。
- 循环执行以下步骤,直到队列为空:
- 从队列中取出队首顶点。
- 将该顶点放入输出队列中。
- 将该顶点的所有出度边指向的顶点入度减1。
- 如果某个顶点的入度为0,则将其放入队列中。
拓扑排序算法可以用来解决许多问题,如任务调度、项目管理等。
针对于无向图的Kruskal算法、Prim算法
Kruskal算法和Prim算法都是求解无向图最小生成树的贪心算法。最小生成树是指在一个无向图中,连接所有顶点的边权和最小的生成树。
Kruskal算法的算法步骤如下:
- 将图中所有的边按权重从小到大排序。
- 依次考虑每条边,如果这条边连接两个不连通的连通分量,则将这条边加入最小生成树中。
Prim算法的算法步骤如下:
- 选择一个起始顶点。
- 将起始顶点放入最小生成树中。
- 循环执行以下步骤,直到所有顶点都加入最小生成树中:
- 从最小生成树中选择一个顶点。
- 将该顶点的所有邻接顶点加入到最小生成树中,如果这些顶点还没有加入最小生成树。
Kruskal算法和Prim算法都是求解无向图最小生成树的有效算法。Kruskal算法的时间复杂度为O(E log E),Prim算法的时间复杂度为O(E log V)。
求权值最短路径的Dijkstra算法
Dijkstra算法是一种求解带权有向图中从一个顶点到其他所有顶点的最短路径的算法。
Dijkstra算法的算法步骤如下:
- 将起始顶点的距离设为0,其他所有顶点的距离设为无穷大。
- 循环执行以下步骤,直到所有顶点的距离都被确定:
- 选择距离最小的顶点。
- 将该顶点标记为已访问。
- 将该顶点的所有出度边指向的顶点的距离更新为更小的值。
Dijkstra算法的时间复杂度为O(V^2),其中V是图中的顶点数。