1. 程式人生 > >初次學習(雙向 bfs)

初次學習(雙向 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++;
    }
}