Xin vui lòng tha thứ cho tôi vì đã hỏi một câu hỏi mới làm quen, nhưng tôi là người mới bắt đầu với các thuật toán và độ phức tạp, và đôi khi thật khó để hiểu được sự phức tạp của một thuật toán cụ thể đã xảy ra như thế nào.
Tôi đã đọc thuật toán DFS từ Giới thiệu về thuật toán của Cormen và đây là thuật toán:
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
Sau đó nó nói dòng 1-3
và 5-7
là O(V)
, không bao gồm thời gian để thực hiện các cuộc gọi đến DFS-VISIT()
. Trong DFS-VISIT()
, các dòng 4-7
là O(E)
, bởi vì tổng các danh sách kề của tất cả các đỉnh là số cạnh. Và sau đó nó kết luận rằng tổng số phức tạp DFS()
là O(V + E)
.
Tôi không hiểu điều đó xảy ra như thế nào. DFS-VISIT()
được gọi là bên trong DFS()
. Vì vậy, nếu dòng 5-7
của DFS()
là O(V)
và DFS-VISIT()
là O(E)
, sau đó không nên tổng độ phức tạp thời điểm DFS()
được O(VE)
?
DFS-VISIT()
" thì điều đó đã trả lời câu hỏi của bạn: "loại trừ DFS-VISIT()
" có nghĩa là thời gian đã nêu không bao gồm thời gian thực hiện DFS-VISIT()
.