这是一篇有关DFS的创作笔记(图论)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
DFS(深度优先搜索)
DFS 全称是 Depth First Search,中文名是深度优先搜索,是一种用于遍历或搜索树或图的算法。所谓深度优先,就是说每次都尝试向更深的节点走。
该算法讲解时常常与BFS并列,但两者除了都能遍历图的连通块以外,用途完全不同,很少有能混用两种算法的情况。
DFS常常用来指代用递归函数实现的搜索,但实际上两者并不一样(搜索)
DFS最显著的特征在于其递归调用自身。同时与 BFS 类似,DFS 会对其访问过的点打上访问标记,在遍历图时跳过已打过标记的点,以确保每个点仅访问一次。符合以上两条规则的函数,便是广义上的 DFS。
具体来说,其框架如下:
以上代码只包含了 DFS 必需的主要结构.实际的 DFS 会在以上代码基础上加入一些代码,利用 DFS 性质进行其他操作
该算法通常的时间复杂度为 𝑂(𝑛+𝑚)𝑂(𝑛 +𝑚)O(n+m)
空间复杂度为 𝑂(𝑛)𝑂(𝑛)O(n),其中 𝑛𝑛n表示点数,mmm表示边数
注意空间复杂度包含了栈空间,栈空间的空间复杂度是 𝑂(𝑛)𝑂(𝑛)O(n)的
在平均 𝑂(1)𝑂(1)O(1)遍历一条边的条件下才能达到此时间复杂度,例如用前向星或邻接表存储图
如果用邻接矩阵则不一定能达到此复杂度
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
实现
栈实现
DFS 可以使用 栈(Stack) 为遍历中节点的暂存容器来实现
这与用 队列(Queue) 实现的 BFS 形成高度对应
递归实现
函数在递归调用时的求值如同对栈的添加和删除元素的顺序,故函数调用所占据的虚拟地址被称为 函数调用栈(Call Stack),DFS 可用递归的方式实现。
以 邻接表(Adjacency List) 作为图的存储方式:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
小结序列
DFS 序列
DFS 序列是指 DFS 调用过程中访问的节点编号的序列。
我们发现,每个子树都对应 DFS 序列中的连续一段(一段区间)。
括号序列
DFS 进入某个节点的时候记录一个左括号 (((,退出某个节点的时候记录一个右括号 ))) .
每个节点会出现两次。相邻两个节点的深度相差 1。
一般图上 DFS
对于非连通图,只能访问到起点所在的连通分量。
对于连通图,DFS 序列通常不唯一。
注:树的 DFS 序列也是不唯一的。
在 DFS 过程中,通过记录每个节点从哪个点访问而来,可以建立一个树结构,称为 DFS 树。DFS 树是原图的一个生成树。
对应题单(搜索+图论)