本文转自 catch_catch 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/I_am_a_winer/article/details/44859807?utm_source=copy
为了记录一下自己学过的东西
双向BFS,既然是双向的,那么就得知道起点和终点,这样,我们就可以进行双向搜索了。
但是,双向BFS是否真的可以提高效率呢?如果能,那么又能提高多少呢?
看到过一个图,说双BFS可以在BFS的基础上把时间和空间复杂度上都减半。实际上,在许多的实际应用中,往往不仅仅是减半!
我们假设,单向BFS需要搜索N层才能到达终点,在每个层需要进行的判断量(即通常的那个for循环)为X。那么,单BFS的运算量为:X^N。
如果换成双BFS,那么前后各搜索 N/2层,那么总的运算量为:2 * ( X ^ ( N/2 ) )。显然当X比较大时,在运算量上不仅仅不仅仅是减半那么简单。特别的,如果X=1,那么双BFS也就退化成了单向BFS了,实际上,此时也就是可以用DFS来进行深搜了,而且代码相对来说更加简洁。
贴一份双BFS的代码(并不是一个真正的代码,而是一个思路):
void BFS(){
queue<state> Q[2];
vis[2];
Q[0].push;Q[1].push();//起终状态入队
vis[0]=vis[1]=1;//标志起终状态
int deep=0;
while(!Q[0].empty()||!Q[1].empty()){
int i=0;
while(i<2){
state tp=Q[i].front();
if(tp.step!=deep){i++;continue;}
Q[i].pop();
for(.....)
if(vis[1-i]) {cout<<(deep*2+i+1)<<endl;return;//找到解
if(vis[i]) continue;//状态已经存在
Q[i].push();
vis[i]=1;
}
}
deep++;
}
}