双方向幅優先探索(双方向BFS)アルゴリズムは、以下のシナリオに適用されます。
- 無向グラフ
- 全ての辺の長さは、全て同じ長さまたは1であります
- 同時に、それは開始点と終了点を与えます
上記の3つの条件が満たされているときは、始点と終点の間の最短距離を見つけるために、双方向の幅最初の検索を使用することができます。
アルゴリズムの説明
双方向の自然や幅優先探索BFSが、同じサブノードが両方向に表示されるまで、開始点と終了点は、同時に出発点に終わりまで延長することになりましたが、検索が終了します。両者が交差する場合、キューは、最後の初めから、検索を開始してから保存の別の状態を状態を保存し、その後、検索が終了します。私たちはキューを使用して実施することができます。最短距離の終わりに開始するノードの交差点までの距離との交差点ノードの始点から終点までの距離です。
Q.双方向BFSは本当に効率を向上させることができていますか?
BFS検索が終了N層に到達する必要があると仮定する方法、各層はXの量、の次に、総計算量決定される X-N ^ X- それは双方向、フロント及び各N / 2層を検索する後必要であればN. BFSを、合計計算量の 2 * X- ^ {N / 2} 2 * X- N / 2。Nが比較的大きく、Xが1でない場合、一方向BFSと比較して、演算量を大幅に低減することができ、ほぼ元のサイズの平方根の順に減少させることができます。
両端キューコレクションをインポート DEF doubleBFS(開始、終了): ==スタートEND IF: リターン1つの。 それぞれ#開始と終了、2つのキューBFSの初めから startQueue、=()両端キューendQueue、両端キュー() startQueue.append(スタート) endQueue .append(エンド) = 0 STEP セットの始点と始点ノードから終点から#が訪問さ startVisited、endVisited =セット()、セット() startVisited.add(開始) endVisited.add(エンド) 一方、LEN(startQueue) lenの及び(endQueue): startSize、endSize = LEN(startQueue)、LEN(endQueue) 層が横断# + = STEP 1。 レンジ(startSize)で_ため: CUR = startQueue.popleft() cur.neighborsで隣人のために: startVisitedで隣人場合:#は重复节点 継続 endVisitedでのelif隣人を:#相交 戻りステップ 他: startVisited.add(隣人) startQueue.append(隣人) ステップ+ = 1 の範囲内_用(endSize) : CUR = endQueue.popleft() cur.neighborsで隣人のために: もしendVisitedで隣人: 継続 startVisitedでのelif隣人を: リターン・ステップ 他: endVisited.add(近隣) endQueue.append(隣人) リターン-1
研究のアドバイス
双方向BFSは(コード相対的な方法BFSの量を倍増さ)困難な、複雑なアルゴリズムを少しマスターすることはありませんが、一般的なBFSを深めるために、アルゴリズムの習熟度を把握する一方で、他の一方で、あなたは基本的には一度書くことができますあなたがインタビューでBFSを最適化する方法の質問をした場合、双方向BFSはほとんどの標準的な答えは、覚えておいてください。
参考資料
https://www.geeksforgeeks.org/bidirectional-search