Graphs
DFS包括了前序 中序 后续等搜索方式
通常用递归
BFS包括level order 是广度搜索
通常用queue(队列)
基本概念
graph
- 顶点(节点)
- 边(连接两个顶点)
- 有边的两个顶点是相邻的
- Optional:边可以有权重
path
一系列被边连接起来的顶点
cycle
首尾相同
深度搜索(DepthFirstSearch)
不停的找到最底层之前不会返回任何东西
Traversal
Tree
前序遍历(Proorder)
根节点->左节点->右节点
1
/ \
2 3
/ \
4 5
顺序为12453
作用:用来复制树结构
中序遍历(Inorder)
左子树->根节点->右子树
顺序为42513
作用:二叉搜索树,按升序输出所有节点值
后序遍历(Postorder)
左子树->右子树->根节点
顺序为45231
作用:删除或者计算树总和,因为他最后访问根节点
层序遍历(Level Order)
从根节点开始,每一层从左往右访问每个节点
作用:寻找树的最短路径,计算树高度
Graph
A
/ \
B C
/ \ \
D E F
DFS Preorder
ABDECF
DFS Postorder
优先访问所有他的邻居节点,最后访问根节点
DEBCFA
Level order
根据距离,从相同距离的开始遍历,越来越远
如何可以多种方式到达,取最小
拓扑排序
不会真正的排序,区别于前序他会restart(回溯),探索完一个分支以后,会回溯到上一个节点,继续探索其他为访问的邻接节点
,根据多个起点,最终全部search,所有左边的节点指向右边
不能用于循环的
可以是DFS(深度优先搜索)的reverse
假设有一个图:
A → B
A → C
B → D
C → D
-
DFS访问顺序可能是:
- 从A开始,访问B(然后再访问D)
- 访问C(然后再访问D)
这个过程中,D会被添加到结果列表中,然后是B和C,最后是A。
-
最终结果列表为
['D', 'B', 'C', 'A']
,反转后变为['A', 'C', 'B', 'D']
,这是一个有效的拓扑排序。
作用:
1. 任务调度
在需要按照特定顺序执行的一系列任务中,拓扑排序可以帮助确定任务的执行顺序。例如,编译多个源文件时,某些文件可能依赖于其他文件,拓扑排序可以确保在编译前先处理所有依赖的文件。
2. 课程安排
在学校中,某些课程可能要求学生在学习之前先完成其他课程。拓扑排序可以帮助安排课程顺序,以确保所有先修课程都在其后续课程之前完成。
3. 项目管理
在项目管理中,拓扑排序可以用来识别项目任务之间的依赖关系,以便确定项目的进度和资源分配。
4. 构建系统
在软件开发中,构建系统通常需要根据文件间的依赖关系进行构建。拓扑排序可以帮助确定构建的顺序,从而避免因依赖问题导致的构建失败。
5. 网络路由
在计算机网络中,拓扑排序可以用于确定数据包在网络中的最佳传输路径,以优化网络流量和资源使用。
6. 数据依赖关系管理
在数据库或其他系统中,拓扑排序可以帮助管理数据之间的依赖关系,以确保数据的完整性和一致性。
7. 算法设计
在设计某些算法时,尤其是动态规划或贪心算法,拓扑排序可以作为一种预处理步骤,用于简化问题或确定处理顺序。
广度优先搜索
相当于level order
遍历到了1,邻接4,5,把4,5都设置为true,然后加入队列里
先进先出,每次处理一个