BFS和DFS的区别

BFS和DFS的区别


前言


提示:以下是本篇文章正文内容,下面案例可供参考

一、BFS的思想

BFS又名广度优先算法,简称广搜,该算法主要是从一个根开始向下一层结点展开病毒式的计算或查找,又在第二层向第三层的过程中进行第一步过程,周而复始。

如图,广搜可以看成,第一层:A->B,A->C。第二层:B->D,B->E、 C->F,C->G。第三层:D->H,D->I、 E->J,E->L、 F->M,F->N、 G->O,G->P。这种“瘟疫式”扩散。
当使用邻接表时,BFS的时间复杂度为O(V+E);当使用邻接矩阵时,BFS的时间复杂度为O(V^2),其中V表示顶点,E表示边。

二、DFS的思想

DFS又名深度优先算法,简称深搜。该算法主要是一条路走到黑,到尽头或者找到目标时才会停止。

如图,深搜是、第一次:A->B->D->H,第二次:A->B->D->I,第三次:A->B->E->J,第四次:A->B->E->L,第五次:A->C->F->M,第六次:A->C->F->N第七次:A->C->G->O,第八次:A->C->G->P;

当使用邻接表时,DFS的时间复杂度也是O(V+E),当使用邻接矩阵时,DFS的时间复杂度也是O(V^2),其中V表示顶点,E表示边。

1.两套模板(仅给出我所喜欢的代码doge)

BFS代码如下(示例):

struct mp {
	int x1,y1;
} w;
int d[4][2]= {{-1,0},{0,1},{1,0},{0,-1}}; //方向偏移
int x2,y2;//用来判断能否经过
int m,n;//地图范围
int v[1001][1001];//用来标记是否已经经过
char mps[1001][1001];//地图数组
queue<mp>q;
void bfs(int x,int y) {//x,y为起点坐标。
	w.x1=x;
	w.y1=y;
	q.push(w);
	sum++;
	while(q.size()) {
		w=q.front();
		q.pop();
		x=w.x1;
		y=w.y1;
		for(int i=0; i<4; i++) {
			x2=x+d[i][0];
			y2=y+d[i][1];
			if(x2>=0&&y2>=0&&x2<n&&y2<m&&v[x2][y2]==0&&mps[x2][y2]=='.') {//可以在这里面加上出口判断和相应的路径长度加法进行判断最优解
				sum++;
				w.x1=x2;
				w.y1=y2;
				v[x2][y2]=1;
				q.push(w);
			}
		}
	}
}

DFS代码如下(示例):

char mps[maxs][maxs]={0};//题目中的地图或者二叉树神魔的
int v[maxs][maxs]={0};//标定是否经过
int dir[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};//方向
int sum;//用来标定能够达到的数有多少
int x,y;//记录起始位置
int m,n;//此处为迷宫的长宽
void dfs(int x,int y) {
	for(int i=0; i<4; i++) {
		int dx=x+dir[i][0];
		int dy=y+dir[i][1];
		if(dx>=0&&dy>=0&&dx<n&&dy<m&&v[dx][dy]==0&&mps[dx][dy]==')'//此处可以随着题目不同而更改) {
			v[dx][dy]=1;
			sum++;//还可以设置查找目标
			dfs(dx,dy);
		}
	}
}
int main(){
录入数据时:根据相关的数或者字符来调整数组mps的类型。
将其压入数组mps,并在其过程中找到起点并记录为x,y。
之后调用dfs函数。
dfs(x,y);
return 0;
}

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容。要在不同的地方使用不同的工具,所有的东西并不是一成不变的,要擅长灵活运用工具,才能进一步提升自己。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值