Tại sao độ phức tạp thời gian của cả DFS và BFS O (V + E)


132

Thuật toán cơ bản cho 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

Vì vậy, tôi nghĩ rằng sự phức tạp thời gian sẽ là:

v1 + (incident edges) + v2 + (incident edges) + .... + vn + (incident edges) 

nơi vlà đỉnh 1đển

Thứ nhất, những gì tôi đã nói có đúng không? Thứ hai, làm thế nào là điều này O(N + E), và trực giác về lý do tại sao sẽ thực sự tốt đẹp. Cảm ơn

Câu trả lời:


268

Tổng của bạn

v1 + (incident edges) + v2 + (incident edges) + .... + vn + (incident edges)

có thể được viết lại như

(v1 + v2 + ... + vn) + [(incident_edges v1) + (incident_edges v2) + ... + (incident_edges vn)]

và nhóm đầu tiên là O(N)trong khi nhóm kia là O(E).


1
Nhưng mọi đỉnh phải được trích xuất từ ​​hàng đợi và đây là log (| Q |) Còn phần này thì sao?
Yola

3
log (| Q |) <log (N) <N do đó bạn có thể bỏ qua thuật ngữ một cách an toàn trong tiệm cận
Mihai Maruseac

2
Nếu trong danh sách kề, mỗi đỉnh được kết nối với tất cả các đỉnh khác thì độ phức tạp sẽ tương đương với O (V + E) = O (V + V ^ 2) = O (V ^ 2). E = V ^ 2 vì số cạnh nhiều nhất = V ^ 2.
Tối đa

Theo câu trả lời của bạn, sự phức tạp sẽ trở thành O (V + 2E)? Vì mỗi cạnh có thể có một cạnh chung với một cạnh khác?
karansky

2
Các điều khoản không đổi có thể được bỏ.
Mihai Maruseac

41

DFS (phân tích):

  • Thiết lập / nhận nhãn đỉnh / cạnh mất O(1)thời gian
  • Mỗi đỉnh được dán nhãn hai lần
    • một lần là KHÔNG GIỚI HẠN
    • một lần như VISITED
  • Mỗi cạnh được dán nhãn hai lần
    • một lần là KHÔNG GIỚI HẠN
    • một lần là KHÁM PHÁ hoặc TRỞ LẠI
  • Phương thức eventEdges được gọi một lần cho mỗi đỉnh
  • DFS chạy O(n + m)đúng lúc với điều kiện đồ thị được biểu diễn bằng cấu trúc danh sách kề
  • Nhớ lại rằng Σv deg(v) = 2m

BFS (phân tích):

  • Cài đặt / nhận nhãn đỉnh / cạnh mất thời gian O (1)
  • Mỗi đỉnh được dán nhãn hai lần
    • một lần là KHÔNG GIỚI HẠN
    • một lần như VISITED
  • Mỗi cạnh được dán nhãn hai lần
    • một lần là KHÔNG GIỚI HẠN
    • một lần là KHÁM PHÁ hoặc CROSS
  • Mỗi đỉnh được chèn một lần vào một chuỗi Li
  • Phương thức eventEdges được gọi một lần cho mỗi đỉnh
  • BFS chạy O(n + m)đúng lúc với điều kiện đồ thị được biểu diễn bằng cấu trúc danh sách kề
  • Nhớ lại rằng Σv deg(v) = 2m

tnx cho chỉnh sửa tôi mới ở đây vì vậy tôi vẫn cố gắng quản lý với màn hình chỉnh sửa :)
TheNewOne

1
cảm ơn vì đã cụ thể bằng cách đề cập rằng các biểu đồ sẽ được biểu thị bằng cấu trúc danh sách kề, nó đã gây ra cho tôi lý do tại sao DFS là O (n + m), tôi sẽ nghĩ đó là O (n + 2m) vì mỗi cạnh được dịch chuyển hai lần bằng cách quay lại.
mib1413456

22

Rất đơn giản mà không có nhiều hình thức: mọi cạnh được xem xét chính xác hai lần và mỗi nút được xử lý chính xác một lần, do đó, độ phức tạp phải là bội số không đổi của số cạnh cũng như số đỉnh.


Dễ hiểu hơn nhiều so với ký hiệu toán học mà không cần giải thích thêm mặc dù đó là những gì Google dành cho.
mLstudent33

11

Độ phức tạp thời gian O(E+V)thay O(2E+V)vì bởi vì nếu độ phức tạp thời gian là n ^ 2 + 2n + 7 thì nó được viết là O (n ^ 2).

Do đó, O (2E + V) được viết là O (E + V)

bởi vì sự khác biệt giữa n ^ 2 và n có vấn đề nhưng không phải giữa n và 2n.


@Am_I_Hãy giúp đỡ ai đó đang yêu cầu 2E ở trên ký hiệu big-oh .... rằng tại sao 2 không được xem xét về độ phức tạp thời gian.
Dhruvam Gupta

@Am_I_Hãy vui lòng xem bài đăng phía trên câu trả lời của tôi .... có người dùng tên Kehe CAI đã viết "Tôi nghĩ rằng mọi cạnh đã được xem xét hai lần và mỗi nút đã được truy cập một lần, vì vậy tổng độ phức tạp của thời gian phải là O (2E + V ). " Vì vậy, tôi đã trả lời từ ngữ .... Hiểu rồi !!!
Dhruvam Gupta

Tôi đã xóa downvote của mình chỉ vì bạn đã chỉnh sửa câu trả lời của mình,
Am_I_Hỗ trợ

3

Tôi nghĩ rằng mọi cạnh đã được xem xét hai lần và mỗi nút đã được truy cập một lần, vì vậy độ phức tạp tổng thời gian phải là O (2E + V).


Ngay cả tôi cũng cảm thấy như vậy. Bất cứ ai có thể giải thích thêm về điều này?
Chaitanya

12
Phân tích Big O bỏ qua hằng số. O (2E + V) là O (E + V).
Hemm

3

Một lời giải thích trực quan cho điều này là bằng cách phân tích một vòng lặp duy nhất:

  1. truy cập một đỉnh -> O (1)
  2. một vòng lặp for trên tất cả các cạnh sự cố -> O (e) trong đó e là một số sự cố cạnh trên một đỉnh v cho trước.

Vì vậy, tổng thời gian cho một vòng lặp là O (1) + O (e). Bây giờ tổng hợp nó cho mỗi đỉnh vì mỗi đỉnh được truy cập một lần. Điều này mang lại

For every V
=> 

    O(1)
    +

    O(e)

=> O(V) + O(E)

2

Giải thích ngắn gọn nhưng đơn giản:

Tôi là trường hợp xấu nhất bạn cần truy cập vào tất cả các đỉnh và cạnh do đó độ phức tạp thời gian trong trường hợp xấu nhất là O (V + E)

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.