图的遍历
定义:图的遍历是指从图中某一顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问一次且仅访问一次。
【注】树其实也是一种特殊的图,所以树的遍历实际上也可以看作一种特殊图上的遍历。
顺序表->树->图
l 广度优先搜索(Breadth-Fist-Search)
【特点】 它是一种分层查找的过程,每向前走一步可能访问一批顶点,不像深度优先搜索那样有回退情况,因此它不是一个递归算法。 为了实现逐层访问,算法必须借助一个辅助队列,以记忆正在访问的顶点的下一层结点(否则的话,访问完当层顶点就下层顶点无法访问了)
【遍历过程】
【性能分析】
A. 空间复杂度:无论邻接表还是邻接矩阵的存储方式,BFS算法都需要借助一个辅助队列Q,n个顶点均需入队列一次, 在最坏的情况下(某一层有很多个顶点<=n-1),空间复杂度为O(v)。
B. 时间复杂度:采用邻接表存储时,每个顶点均需搜索一次(或入队列一次),故时间复杂度为O(v),在搜索任一顶点的邻接点时,每条边至少访问一次(重复访问难以避免,但以visited[i]来判定),故时间复杂度为O(e),算法总时间复杂度为O(v+e)。
【在这里 访问是基本操作】 ;而采用邻接矩阵是,查找每个顶点的邻接点所需时间为O(v),(v+v+….+v,有v*v个)故算法总时间复杂度为O(v^2)
【应用】
1) 单源最短路径
使用BFS,可以求解一个非带权图的单源最短路径。最短路径d(u,v)表示从u到v的 任何路径中最少的边数,如果从d到v没有通路,则d(u,v)=
原理:广度优先搜索总是按照距离由近到远(按层次)的来遍历图中每个顶点的性 质决定的。
2) 广度优先生成树
广度遍历的过程中得到一棵遍历树称之为广度优先生成树。
【注】邻接矩阵的存储表示是唯一(规则排列),而邻接表的存储表示不唯一(和输入次序有关),所以其生成树也不唯一。 如果图是非连通的,则会生成森林。
l 深度优先搜索(Depth-First-Search)
搜索策略:尽可能深的搜索一个图,遇到不能访问时,依次回退到最近被访问的顶点,若它还有邻接顶点未被访问过,则从该点开始继续上述搜索过程,直到图中所有顶点均被访问过。
【性能分析】
A. 空间复杂度:DFS是一个递归算法,需借助一个递归供作栈,故它的空间复杂度为O(V)
B. 时间复杂度:
1. 遍历图的过程实质是对每个顶点查找其邻接顶点的过程,其耗费的时间取决于所采用的存储结构。
2. 当以邻接矩阵表示时,查找每个顶点的邻接点所需时间为O(v),故总的时间复杂度O(v^2)。
3. 当以邻接表表示时,查找所有顶点的邻接点所需时间为O(E)(按边表查询),访问顶点所需时间为O(V),故总得时间复杂度为O(V+E)
【深度优先生成树和生成森林】
同广度优先搜索一样,对连通图调用DFS才可以产生深度优先搜索树,否则产 生的是深度优先生成森林。
l 图的遍历与图的连通性
1. 对于无向图来说,如果无向图是连通的,则从任一顶点出发,仅需一次遍历(BFS/DFS)就能够访问到图中所有的点。否则,只能访问到该顶点所在连通分量的所有顶点。
2. 对于有向图来说,若从初始点到图中每个顶点都有路径,则能够访问到图中所有顶点,否则,便不能访问所有。(方向性相当强)
3. 所以为了能够在非连通图也能遍历到所有顶点,故在BFSTraverse/DFSTraverse中加入顶点的循环访问。
4. 由此可知,对于无向图遍历中,调用BFS/DFS的次数等于改图的连通分量(极大连通子图)数。
但在有向图遍历中,因为一个连通的有向图分为强连通和弱连通,它的连通子图也分为强连通分量和非强连通分量。
强连通图的调用DFS/BFS次数等于其连通分量(极大强连通子图)数。
非强连通图中,非强连通分量调用一次DFS/BFS无法访问到该连通分量的所有顶点。