BFSとDFSの違いを理解する

幅優先探索

    BFSはBreadthFirst Searchの略で、グラフ内の最短経路を見つけるために使用される頂点ベースのテクノロジーです。先入れ先出しキューのデータ構造を使用します。BFSでは、一度に1つの頂点が選択されてマークが付けられ、次に隣接する頂点がアクセスされてキューに格納されます。DFSよりも遅いです。

        A
       / \
      B   C
     /   / \
    D   E   F

    出力は次のとおりです。

A, B, C, D, E, F
深さ優先探索

    DFSは、エッジベースのテクノロジーであるDepth FirstSearchの略です。スタックデータ構造を使用して2つのステージを実行します。最初に、訪問した頂点がスタックにプッシュされ、次に、訪問されていない頂点がない場合は、訪問された頂点がポップされます。

        A
       / \
      B   C
     /   / \
    D   E   F

    出力は次のとおりです。

A, B, D, C, E, F
BFSとDFS
シリアルナンバー BFS DFS
1 BFSは幅優先探索の略です DFSはDepthFirstSearchの略です
2 BFS(幅優先探索)は、キューデータ構造を使用して最短パスを見つけます DFS(深さ優先探索)はスタックデータ構造を使用します
3 BFSは、特定のソースに近い頂点を検索するのに適しています ソースから遠く離れたソリューションがある場合は、DFSの方が適しています
4 BFSはすべてのネイバーを最初に考慮するため、ゲームやパズルの決定木には適していません。 DFSは、ゲームやパズルの問題に適しています。私たちは決定を下し、その決定へのすべての道を探ります。この決定が勝利の状況につながる場合、私たちは停止します。
5 隣接リストを使用する場合、BFSの時間計算量はO(V + E)です。隣接行列を使用する場合、BFSの時間計算量はO(V ^ 2)です。ここで、Vは頂点を表し、Eはエッジを表します。 隣接リストを使用する場合、DFSの時間計算量もO(V + E)です。隣接行列を使用する場合、DFSの時間計算量もO(V ^ 2)です。ここで、Vは頂点を表し、Eはエッジを表します。 。
二分木のBFSとDFSとは何ですか?

    通常、ツリーは2つの方法でトラバースされます。

  • 幅優先探索
  • 深さ優先探索
    • インオーダートラバーサル(左-ルート-右)
    • プレオーダートラバーサル(ルート-左-右)
    • ポストオーダートラバーサル(左右ルート)
      ここに画像の説明を挿入します
BFS and DFSs of above Tree

Breadth First Traversal : 1 2 3 4 5

Depth First Traversals:
      Preorder Traversal : 1 2 4 5 3 
      Inorder Traversal  :  4 2 5 1 3 
      Postorder Traversal : 4 5 2 3 1
余分なスペースに違いはありますか?

    必要な追加スペースは異なります。

  1. 水平シーケンストラバーサルに必要な追加スペースはO(w)です。ここで、wは二分木の最大幅です。水平シーケンストラバーサルでは、異なるレベルのノードが次々にキューに格納されます。
  2. 深さ優先走査に必要な追加スペースはO(h)です。ここで、hは二分木の最大深さです。深さ優先走査では、スタック(または関数呼び出しスタック)はノードのすべての祖先を格納します。

    深さ(または高さ)hでの二分木の最大幅は2 h 2 ^ hにすることができます2h、ここで、hは0から始まります。したがって、ノードの最大数は最後のレベルにすることができます。最悪のケースは、バイナリツリーが1、3、7、15 ...ノードの完全なバイナリツリーである場合に発生します。最悪の場合、2時間2 ^ h2hの値はCeil(n / 2)です。
    平衡二分木の高さはO(Log n)です。最悪の場合は傾斜した木で発生し、最悪の場合は高さがO(n)になることです。
    したがって、最悪の場合、両方に必要な追加スペースはO(n)です。しかし、最悪のケースはさまざまな種類の木で発生します。
    上記の点から、ツリーのバランスが取れていると、水平方向のシーケンシャルトラバーサルに必要な追加スペースが多くなり、ツリーのバランスが悪いと、深さ優先トラバーサルに必要な追加スペースが多くなる可能性があることは明らかです。

選び方は?
  1. 追加のスペースが考慮すべき要素になる場合があります(上記で説明)
  2. 深さ優先走査は通常再帰的であり、再帰的コードには関数呼び出しシステムのオーバーヘッドが必要です。
  3. 最も重要な点は、BFSはルートからノードにアクセスし、DFSはリーフからノードにアクセスすることです。したがって、問題がルートに近いものを検索することである場合は、BFSを使用します。ターゲットノードがリーフに近い場合は、DFSを選択します。
参照文書

[1] MKS075.BFSとDFSの違い[EB / OL] .https://www.geeksforgeeks.org/difference-between-bfs-and-dfs/,2020-07-03。
[2] Deeraj Gupta.BFS vs DFS for Binary Tree [EB / OL] .https://www.geeksforgeeks.org/bfs-vs-dfs-binary-tree/,2016-12-22。

おすすめ

転載: blog.csdn.net/zsx0728/article/details/114669472