2013-09-04 86 views
9

Một số giả ở đây (bỏ qua phong cách của tôi)Tại sao độ phức tạp của BFS O (V + E) thay vì O (V * E)?

Bắt đầu từ v1 (enqueued):

function BFS(queue Q) 
    v2 = dequeue Q 
    enqueue all unvisited connected nodes of v2 into Q 
    BFS(Q) 
end // maybe minor problems here 

Vì có V đỉnh trong đồ thị, và những đỉnh V được kết nối với E cạnh, và quý khách đến thăm nhận các nút kết nối (tương đương với các kết nối được truy cập) nằm trong vòng lặp bên trong (vòng lặp bên ngoài là đệ quy chính nó), dường như với tôi rằng độ phức tạp phải là O (V * E) thay vì O (V + E). Bất cứ ai có thể giải thích điều này cho tôi?

+0

Rất đơn giản mà không có nhiều hình thức: mỗi lần được xem 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ố cố định của số cạnh cũng như số đỉnh. –

+0

Điều này bao gồm việc có cơ chế tránh chu kỳ –

Trả lời

8

E không phải là số cạnh cạnh với mỗi đỉnh - thực tế là tổng số cạnh của biểu đồ. Xác định nó theo cách này là hữu ích bởi vì bạn không nhất thiết phải có cùng số cạnh trên mỗi đỉnh.

Vì mỗi cạnh được truy cập một lần vào lúc DFS kết thúc, bạn nhận được độ phức tạp O (E) từ phần đó. Sau đó, bạn thêm O (V) để truy cập mỗi đỉnh một lần và nhận được O (V + E) trên tổng số.

+3

Câu trả lời của bạn tổng quát hơn một chút - nó có thể liên quan đến cả tìm kiếm chiều sâu (DFS) và tìm kiếm theo chiều rộng (BFS). Có lẽ đó là lý do tại sao bạn đã đánh sai BFS là DFS trong câu trả lời của bạn (lưu ý câu hỏi đã yêu cầu BFS). – yasen