Bitte verzeihen Sie mir, dass ich eine Anfängerfrage gestellt habe, aber ich bin ein Anfänger in Algorithmen und Komplexitäten, und es ist manchmal schwer zu verstehen, wie die Komplexität für einen bestimmten Algorithmus zustande gekommen ist.
Ich habe den DFS-Algorithmus aus Einführung in Algorithmen von Cormen gelesen , und dies war der Algorithmus:
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
Es sagte dann Zeilen 1-3
und 5-7
sind O(V)
, ausschließlich der Zeit, um die Anrufe auszuführen DFS-VISIT()
. In DFS-VISIT()
Linien 4-7
sind O(E)
, weil die Summe der Adjazenzlisten aller den Eckpunkten die Anzahl der Kanten ist. Und dann kam es zu dem Schluss, dass die Gesamtkomplexität von DFS()
ist O(V + E)
.
Ich verstehe nicht, wie es dazu kam. DFS-VISIT()
heißt drinnen DFS()
. Wenn also Linien 5-7
von DFS()
sind O(V)
und DFS-VISIT()
sind O(E)
, sollte dann nicht die Gesamtzeitkomplexität von DFS()
sein O(VE)
?
DFS-VISIT()
" steht, wird Ihre Frage bereits beantwortet: "exklusiv für DFS-VISIT()
" bedeutet, dass die angegebene Zeit nicht die von enthaltene Zeit enthält DFS-VISIT()
.