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