软考考点之图的遍历时间复杂度

不做题,一些重要的解题思路及忽略的知识点就不会被总结。---2019-9-27于济南

图的遍历是指从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次。

如2016年上半年

第61题:以下关于图的遍历的叙述中,正确的是(61)。
A. 图的遍历是从给定的源点出发对每一个顶点仅访问一次的过程
B. 图的深度优先遍历方法不适用于无向图
C. 使用队列对图进行广度优先遍历
D. 图中有回路时则无法进行遍历

答:为什么A不对,不是从给定的顶点

只能选 C

深度优先搜索:DFS

深度优先搜索(Depth_Fisrst Search)遍历类似于树的先根遍历,是树的先根遍历的推广。

实质上是对每个顶点查找其邻接点的过程,其耗费的时间取决于所采用结构。

显然,这是一个递归的过程。为了在遍历过程中便于区分顶点是否已被访问,需附设访问标志数组visited[0:n-1], ,其初值为FALSE ,一旦某个顶点被访问,则其相应的分量置为TRUE。

从图的某一点v 出发,递归地进行深度优先遍历的过程如下:

void DFS(Graph G,int v )
{ /*从第v 个顶点出发递归地深度优先遍历图G*/
	visited[v]=TRUE;VisitFunc(v); /*访问第v 个顶点*/
	for(w=FisrAdjVex(G,v);w; w=NextAdjVex(G,v,w))
		if (!visited[w]) 
			DFS(G,w); /*对v 的尚未访问的邻接顶点w 递归调用DFS*/
}

邻接表表示时,查找所有顶点的邻接点所需时间为O(E),访问顶点的邻接点所花时间为O(V),此时,总的时间复杂度为O(V+E)。

邻接矩阵表示时,查找每个顶点的邻接点所需时间为O(V),要查找整个矩阵,故总的时间度为O(V^2)。 

 v为图的顶点数,E为边数。


什么是邻接表呢?采用数组和链表结合的方式存储

无向图的邻接表定义

有向图的邻接表定义

广度优先遍历:BSF

和树的层序遍历算法类同,是从图的某一顶点V0出发,访问此顶点后,依次访问V0的各个未曾访问过的邻接点;然后分别从这些邻接点出发,直至图中所有已被访问的顶点的邻接点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作起点,重复上述过程,直至图中所有顶点都被访问为止。

图的广度优先遍历算法需要一个队列以保持访问过的顶点的顺序,以便按顺序访问这些顶点邻接顶点。连通图的广度优先遍历算法为:

(1)访问初始顶点v并标记顶点v为已访问;
(2)顶点v入队列;
(3)当队列非空时则继续执行,否则算法结束;
(4)出队列取得队头顶点u;
(5)查找顶点u的第一个邻接顶点w;
(6)若顶点u的邻接顶点w不存在,则转到步骤(3),否则执行后序语句:

①若顶点w尚未被访问,则访问顶点w并标记顶点w为已访问;
②顶点w入队列;
③查找顶点u的邻接顶点w后的下一个邻接顶点,转到步骤(6)。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guangod

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值