Độ phức tạp thời gian của Độ sâu Tìm kiếm Đầu tiên [đã đóng]


7

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-35-7O(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-7O(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()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-7của DFS()O(V)DFS-VISIT()O(E), sau đó không nên tổng độ phức tạp thời điểm DFS()được O(VE)?


6
Cormen chỉ là tác giả được liệt kê đầu tiên.
Yuval Filmus

1
Chào mừng bạn đến với Khoa học máy tính! Câu hỏi của bạn là một câu hỏi rất cơ bản. Hãy để tôi hướng bạn đến các câu hỏi tham khảo của chúng tôi bao gồm một số nguyên tắc cơ bản mà bạn dường như đang thiếu chi tiết. Vui lòng xử lý các câu hỏi liên quan được liệt kê ở đó, cố gắng giải quyết vấn đề của bạn một lần nữa và chỉnh sửa để bao gồm các nỗ lực của bạn cùng với các vấn đề cụ thể bạn gặp phải. Chúc may mắn!
Raphael

Bạn có thể đưa ra trích dẫn chính xác của văn bản mà bạn không hiểu? Nếu nó có nghĩa đen là "không bao gồm thời gian để thực hiện các cuộc gọi đến 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().
David Richerby

Câu trả lời:


8

Cuốn sách đang đếm số lần mỗi dòng được thực thi trong toàn bộ quá trình thực hiện lệnh gọi của DFS, thay vì số lần nó được thực hiện trong mỗi cuộc gọi của chương trình con DFS-VISIT. Có lẽ ví dụ đơn giản sau đây sẽ làm rõ điều này:

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

Trong mỗi lần thực hiện của A, dòng 1 của B được thực hiện lần và bản thân B được thực hiện lần. Tuy nhiên, thời gian chạy là chứ không phải .nnO(n)O(n2)

Đây là một ví dụ khác, trong đó một mảng có liên quan.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

Quy trình COUNT đếm số lượng 1 giây trong mảng đầu vào T. Mặc dù ADVANCE có thể được gọi tới lần bởi COUNT và thời gian chạy trường hợp xấu nhất của ADVANCE là , các dòng 1 Cách2 của ADVANCE chạy nhiều nhất lần và do đó tổng thời gian chạy là thay vì .nO(n)nO(n)O(n2)


Ừm ... tôi vẫn không thể hiểu. Độ phức tạp thời gian B()O(1), vì vậy nếu iđược gọi từ 1 to n, thì đó là n lần O(1)-> O(n). Bạn nói dòng 1 của B được thực hiện n lần và bản thân B được thực hiện n lần, nhưng chúng không giống nhau sao?
Sidharth Samant

Chúng là những điều tương tự trong ví dụ này, nhưng không phải trong trường hợp của DFS.
Yuval Filmus 16/07/2016

1
Tôi đã thêm một ví dụ khác giống với những gì xảy ra trong DFS.
Yuval Filmus 16/07/2016

Yuval sir @ tôi có một nghi ngờ. Trong thuật toán ví dụ được cung cấp của bạn, nếu được gọi là lần có nghĩa là Xin vui lòng giúp tôi! AnO(n2)
laura

1
Chạy một thủ tục lần cần có thời gian . Θ(f(n))g(n)Θ(f(n)g(n))
Yuval Filmus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.