初次学习(双向 bfs)

本文转自 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++;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值