深さ優先検索の時間の複雑さ[終了]


7

初心者の質問をすることを許してください。しかし、私はアルゴリズムと複雑さの初心者であり、特定のアルゴリズムの複雑さがどのようにして生じたのか理解するのが難しい場合があります。

コーメンのアルゴリズムの紹介から DFSアルゴリズムを読んでいましたが、これがアルゴリズムでした。

G        -> graph
G.V      -> set of vertices in G
u.π      -> parent vertex of vertex u
G.Adj[u] -> adjacency list of vertex u


DFS(G)
1   for each vertex u ∈ G.V
2       u.color = WHITE
3       u.π = NIL
4   time = 0
5   for each vertex u ∈ G.V
6       if u.color == WHITE
7         DFS-VISIT(G,u)

DFS-VISIT(G,u)
1   time = time + 1            // white vertex u has just been discovered
2   u.d = time
3   u.color = GRAY
4   for each v ∈ G.Adj[u]      // explore edge u
5       if v.color == WHITE
6           v.π = u
7           DFS-VISIT(G,v)
8   u.color = BLACK            // blacken u; it is finished
9   time = time + 1
10  u.f = time

次に、行1-35-7が表示されO(V)、への呼び出しを実行する時間を除きますDFS-VISIT()。ではDFS-VISIT()、すべての頂点の隣接リストの合計がエッジの数であるため、行4-7O(E)です。そして、それは全体の複雑さがあると結論付けDFS()ていますO(V + E)

それがどうして起こったのか分かりません。内部DFS-VISIT()で呼び出さ DFS()ます。ラインあれば、5-7のがDFS()あるO(V)DFS-VISIT()されO(E)、その後、全体の時間の複雑さはいけませんDFS()ことO(VE)


6
コーメンは最初にリストされた著者にすぎません。
Yuval Filmus

1
コンピュータサイエンスへようこそ!あなたの質問は非常に基本的なものです。詳細に欠落していると思われるいくつかの基礎をカバーする参照質問にあなたを導きましょう。そこにリストされている関連する質問に取り組み、問題をもう一度解決してみて、発生した特定の問題とともにその試みを含めるように編集してください。幸運を!
ラファエル

理解できないテキストの正確な引用を教えてもらえますか?それが文字通り「呼び出しを実行する時間を除く」と言っている場合、それはDFS-VISIT()すでにあなたの質問に答えています:「排他的DFS-VISIT()」とは、指定された時間にが費やした時間を含まないことを意味しDFS-VISIT()ます。
David Richerby 2016

回答:


8

本は、DFS-VISITサブルーチンの各呼び出しで実行される回数ではなく、DFSの呼び出しの実行全体を通して各行が実行される回数をカウントしています。おそらく、次の簡単な例でこれが明らかになるでしょう。

PROCEDURE A(n)
1  global = 0
2  for i from 1 to n:
3      B(i)
4  return global

PROCEDURE B(i)
1  global = global + 1

Aを実行するたびに、Bの行1が回実行され、B自体が回実行されます。それにもかかわらず、実行時間はではなく。nnO(n)O(n2)

次に、配列が関係する別の例を示します。T[1n]

PROCEDURE COUNT(n, T[1...n]):
1  count = 0
2  index = 1
3  while index <= n:
4    ADVANCE()
5    count = count + 1
6    index = index + 1
7  return count - 1

PROCEDURE ADVANCE():
1  while index <= n and T[index] == 0:
2    index = index + 1

プロシージャCOUNTは、入力配列T内の1の数をカウントします。ADVANCEはCOUNT によって回まで呼び出すことができ、ADVANCE の最悪の実行時間は、ADVANCEの行1〜2は最大で実行されます回、全体の実行時間があるので、ではなく。nO(n)nO(n)O(n2)


ええと…まだ理解できません。の時間の複雑さB()O(1)なので、iから呼び出された場合1 to n、n回ですO(1)-> O(n)。あなたはBの1行目が実行されたと言うのn倍とB自体が実行されたN回、しかし、彼らは同じものではありませんか?
Sidharth Samant

これらはこの例では同じですが、DFSの場合は異なります。
Yuval Filmus

1
私は、DFSで発生することにより似た別の例を追加しました。
Yuval Filmus

Yuval sir @私は疑問を持っています。提供されたExampleアルゴリズムで、 が回呼び出されてを意味する場合はどうですか。AnO(n2)
ローラ

1
プロシージャを回実行すると、時間がかかる。Θ(f(n))g(n)Θ(f(n)g(n))
Yuval Filmus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.