所谓的 双向BFS

来源:互联网 发布:pyqt5 知乎编程 编辑:程序博客网 时间:2024/06/01 01:34

双向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++;    }}




0 0
原创粉丝点击