web-dev-qa-db-ja.com

DFSとBFSの両方の時間の複雑さはなぜO(V + E)

BFSの基本的なアルゴリズム:

set start vertex to visited

load it into queue

while queue not empty

   for each Edge incident to vertex

        if its not visited

            load into queue

            mark vertex

したがって、時間の複雑さは次のようになります。

v1 + (incident edges) + v2 + (incident edges) + .... + vn + (incident edges) 

ここで、vは頂点1からnです

まず、私が言ったことは正しいですか?第二に、このO(N + E)はどのようになっているのか、そしてなぜ本当に素晴らしいのかについての直感。ありがとう

114
ordinary

あなたの合計

v1 + (incident edges) + v2 + (incident edges) + .... + vn + (incident edges)

として書き換えることができます

(v1 + v2 + ... + vn) + [(incident_edges v1) + (incident_edges v2) + ... + (incident_edges vn)]

最初のグループはO(N)で、もう一方のグループはO(E)です。

239
Mihai Maruseac

DFS(分析):

  • 頂点/エッジラベルの設定/取得にはO(1)時間かかります
  • 各頂点には2回ラベルが付けられます
    • 一度未計画として
    • 一度VISITTEDとして
  • 各エッジには2回ラベルが付けられます
    • 一度未計画として
    • dISCOVERYまたはBACKとして1回
  • メソッドインシデントエッジは、各頂点に対して1回呼び出されます
  • グラフが隣接リスト構造で表される場合、DFSはO(n + m)時間で実行されます
  • Σv deg(v) = 2mを思い出してください

BFS(分析):

  • 頂点/エッジラベルの設定/取得にはO(1)時間かかります
  • 各頂点には2回ラベルが付けられます
    • 一度未計画として
    • 一度VISITTEDとして
  • 各エッジには2回ラベルが付けられます
    • 一度未計画として
    • dISCOVERYまたはCROSSとして1回
  • 各頂点は、シーケンスLiに1回挿入されます
  • メソッドインシデントエッジは、各頂点に対して1回呼び出されます
  • グラフが隣接リスト構造で表される場合、BFSはO(n + m)時間で実行されます
  • Σv deg(v) = 2mを思い出してください
36
TheNewOne

あまり形式的ではない非常に単純化されています。すべてのEdgeは正確に2回考慮され、すべてのノードは正確に1回処理されるため、複雑さはEdgeの数と頂点の数の定数倍でなければなりません。

18
JavaFreak

時間の複雑さは、O(E+V)ではなくO(2E+V)です。これは、時間の複雑さがn ^ 2 + 2n + 7の場合、O(n ^ 2)と書き込まれるためです。

したがって、O(2E + V)はO(E + V)と記述されます

これは、n ^ 2とnの差が重要であり、nと2nの差ではないためです。

10
Dhruvam Gupta

すべてのEdgeが2回考慮され、すべてのノードが1回アクセスされたため、合計時間の複雑さはO(2E + V)になるはずです。

3
Kehe CAI

短いが簡単な説明:

最悪の場合、すべての頂点とエッジを訪問する必要があります。したがって、最悪の場合の時間の複雑さはO(V + E)です。

2
CodeYogi

これに対する直感的な説明は、単純に単一のループを分析することです。

  1. 頂点を訪問-> O(1)
  2. すべての入射エッジのforループ-> O(e)ここで、eは特定の頂点vに入射するエッジの数です。

したがって、単一ループの合計時間はO(1)+ O(e)です。各頂点を1回訪れたときに、各頂点について合計します。これは与える

Sigma_i

p {
    height: 50px;
    line-height: 50px;
}

span {
    position: relative;
    font-size: 2.5em;
    display: inline-block;
    line-height: .7em;
    vertical-align: middle;
}

span:before {
    font-size: 12px;
    display: block;
    position absolute;
    left: 0;
    top: 0;
    content: "V";
    width: 22px;
    text-align: center;
}

span:after {
    font-size: 12px;
    display: block;
    position absolute;
    left: 0;
    bottom: 0;
    content: "k = 1";
    width: 27px;
    text-align: center;
}
<p>
    <span>&Sigma;</span>
    O(1) + O(e)
=> 
    <span>&Sigma;</span>
    O(1)
    +
   <span>&Sigma;</span>
    O(e)

=> O(V) + O(E)

</p>

[O(1) + O(e)]

2
Ultrablendz