初次學習(雙向 bfs)
阿新 • • 發佈:2018-12-12
為了記錄一下自己學過的東西
雙向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++; } }