所谓的 双向BFS

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

    原文作者:BFS
    原文地址: https://blog.csdn.net/i_am_a_winer/article/details/44859807
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞