双方向の幅最初の検索を最適化するために、BFSアルゴリズム

双方向幅優先探索(双方向BFS)アルゴリズムは、以下のシナリオに適用されます。

  1. 無向グラフ
  2. 全ての辺の長さは、全て同じ長さまたは1であります
  3. 同時に、それは開始点と終了点を与えます

上記の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

アプリケーション例

無向グラフにおける最短経路
の騎士最短経路
騎士最短経路II

おすすめ

転載: www.cnblogs.com/bonelee/p/11724526.html
おすすめ