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


132

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頂点はどこ1n

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

回答:


268

あなたの合計

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)


1
しかし、すべての頂点はキューから抽出する必要があり、これはlog(| Q |)です。この部分はどうですか?
Yola、2016年

3
log(| Q |)<log(N)<Nしたがって、漸近の用語を安全に無視できます
Mihai Maruseac

2
隣接リストで各頂点が他のすべての頂点に接続されている場合、複雑度はO(V + E)= O(V + V ^ 2)= O(V ^ 2)と同等になります。エッジの最大数= V ^ 2であるため、E = V ^ 2。
最大

あなたの答えによると、複雑さはO(V + 2E)になりませんか?すべてのエッジに別のエッジとの共通のエッジがある可能性があるので?
karansky 2017

2
定数項は削除できます。
Mihai Maruseac

41

DFS(分析):

  • 頂点/エッジラベルの設定/取得にはO(1)時間がかかる
  • 各頂点は2回ラベル付けされます
    • かつては未踏だった
    • 一度訪問した
  • 各エッジは2回ラベル付けされます
    • かつては未踏だった
    • DISCOVERYまたはBACKとして1回
  • メソッドIncidentEdgesは頂点ごとに1回呼び出されます
  • O(n + m)グラフが隣接リスト構造で表されている場合、DFSは時間内に実行されます
  • それを思い出します Σv deg(v) = 2m

BFS(分析):

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

編集用のtnx私はここにいるので、編集画面で管理を試みます:)
TheNewOne

1
グラフが隣接リスト構造で表されることに言及して具体的に感謝します。DFSがO(n + m)である理由は私を悩ませていました。各エッジが2回トラバースされるため、O(n + 2m)だと思いますバックトラックによって。
mib1413456 14

22

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


それがグーグルの目的であるけれども、それ以上の説明なしで数学表記よりはるかに理解しやすいです。
mLstudent33

11

時間計算量は、O(E+V)代わりのO(2E+V)時間複雑度はN ^ 2 + 2N + 7、それはO(N ^ 2)のように記述されている場合ため。

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

n ^ 2とnの違いは重要ですが、nと2nの違いは重要ではありません。


@Am_I_Helpful誰かが2Eをbig-oh表記で上記に求めています....なぜ2は時間の複雑さで考慮されないのですか?
Dhruvam Gupta

@Am_I_Helpful私の回答の上にある投稿を参照してください... Kehe CAIという名前のユーザーが「すべてのエッジが2回検討され、すべてのノードが1回アクセスされたと思うので、合計時間の複雑さはO(2E + V )」だから私はそれに応じて答えた....それを得た!!!
Dhruvam Gupta

あなたがあなたの答えを編集したという理由だけで、私の反対票を削除しました
Am_I_Helpful

3

すべてのエッジが2回検討され、すべてのノードが1回アクセスされたと思うので、合計時間の複雑さはO(2E + V)になるはずです。


私も同じように感じます。誰でもこれについてさらに説明できますか?
Chaitanya 2015

12
Big O分析は定数を無視します。O(2E + V)はO(E + V)です。
ヘム

3

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

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

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

For every V
=> 

    O(1)
    +

    O(e)

=> O(V) + O(E)

2

短くて簡単な説明:

私はすべての頂点とエッジにアクセスする必要がある最悪のケースなので、最悪のケースの時間の複雑さはO(V + E)です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.