Độ phức tạp thời gian để đi qua từng cạnh liền kề của một đỉnh là O(N)
, trong đó N là số cạnh kề nhau. Vì vậy, đối với V số đỉnh phức tạp thời gian trở thành O(V*N)
= O(E)
, trong đó E là tổng số cạnh của biểu đồ. Vì việc loại bỏ và thêm một đỉnh từ/vào Hàng đợi là O(1)
, tại sao nó được thêm vào độ phức tạp tổng thể của BFS là O(V+E)
.Chiều rộng Phân tích phức tạp thời gian tìm kiếm đầu tiên
Trả lời
Tôi hy vọng điều này sẽ hữu ích đối với bất kỳ ai gặp khó khăn trong việc hiểu sự phức tạp về thời gian tính toán cho Breadth First Search a.k.a BFS.
Queue graphTraversal.add(firstVertex);
// This while loop will run V times, where V is total number of vertices in graph.
while(graphTraversal.isEmpty == false)
currentVertex = graphTraversal.getVertex();
// This while loop will run Eaj times, where Eaj is number of adjacent edges to current vertex.
while(currentVertex.hasAdjacentVertices)
graphTraversal.add(adjacentVertex);
graphTraversal.remove(currentVertex);
Thời gian phức tạp như sau:
V * (O(1) + Eaj + O(1))
V + V * Eaj + V
2V + E(total number of edges in graph)
V + E
tôi đã cố gắng đơn giản hóa mã và độ phức tạp tính toán nhưng vẫn còn nếu bạn có bất kỳ câu hỏi cho tôi biết.
Thực hiện thao tác O(1)
L
lần, dẫn đến độ phức tạp O(L)
. Vì vậy, việc loại bỏ và thêm một đỉnh từ/vào Hàng đợi là O (1), nhưng khi bạn làm điều đó cho các đỉnh V
, bạn sẽ nhận được độ phức tạp O(V)
. Do đó, O(V) + O(E) = O(V+E)
Xem xét biểu đồ sau, chúng ta thấy độ phức tạp của thời gian là O (| V | + | E |) nhưng không phải là O (V * E).
danh sách kề
V E
v0:{v1,v2}
v1:{v3}
v2:{v3}
v3:{}
hoạt động như thế nào BFS trình Step by Step
Bước 1:
host ở xa danh sách:
V E
v0: {v1,v2} mark, enqueue v0
v1: {v3}
v2: {v3}
v3: {}
Bước 2:
host ở xa danh sách:
V E
v0: {v1,v2} dequeue v0;mark, enqueue v1,v2
v1: {v3}
v2: {v3}
v3: {}
Bước 3:
danh sách một host
V E
v0: {v1,v2}
v1: {v3} dequeue v1; mark,enqueue v3
v2: {v3}
v3: {}
Step4:
danh sách một host
V E
v0: {v1,v2}
v1: {v3}
v2: {v3} dequeue v2, check its adjacency list (v3 already marked)
v3: {}
Bước 5:
host ở xa danh sách:
V E
v0: {v1,v2}
v1: {v3}
v2: {v3}
v3: {} dequeue v3; check its adjacency list
Bước 6:
danh sách một host
V E
v0: {v1,v2} |E0|=2
v1: {v3} |E1|=1
v2: {v3} |E2|=1
v3: {} |E3|=0
Tổng số bước sau:
|V| + |E0| + |E1| + |E2| +|E3| == |V|+|E|
4 + 2 + 1 + 1 + 0 == 4 + 4
8 == 8
Giả sử một đại diện danh sách kề, V là số đỉnh, E số cạnh.
Mỗi đỉnh được hấp thụ và khử nhiễu nhiều nhất một lần.
Quét cho tất cả các đỉnh liền kề mất O (| E |) thời gian, vì tổng độ dài của danh sách kề là | E |.
Do đó Độ phức tạp về thời gian của BFS mang lại một sự phức tạp về thời gian O (| V | + | E |).
Xin cảm ơn, Giải thích tốt. –
I understood the part V+E in the complexity.
But I have 2 questions
1). V * Eaj should give 2E?
(as it is the total no of edges accessed, and each edge is checked twice, by each of it ends)
2) Also the complexity is V + E
but in worst case we take E = V*(V-1)/2
So V isn't required here as we could say we E = V²...
Can't we say complexity O(E) only?
1. Hằng số bị bỏ qua. 2. Nếu một biểu đồ có nhiều nút nhưng không có cạnh, chúng ta vẫn phải enqueue/dequeue cho mỗi nút. Ví dụ này chỉ ra rằng E = O (V^2) chỉ khi tất cả các nút được kết nối trong một đồ thị. –
1. Hằng số bị bỏ qua, tôi chỉ muốn biết rằng sử dụng khái niệm sẽ cho 2 * E sẽ được lấy là E. Cảm ơn lời giải thích. – Vishwas
- 1. Chiều rộng tìm kiếm đầu tiên phân nhánh yếu tố
- 2. Phân tích phức tạp thời gian sử dụng big-o
- 3. Tìm kiếm đầu tiên về chiều sâu và chiều rộng Tìm hiểu đầu tiên
- 4. Độ phức tạp về thời gian của thuật toán đồ thị độ sâu đầu tiên
- 5. Ưu tiên tìm kiếm chiều sâu trên bề rộng tìm kiếm đầu tiên hoặc ngược lại
- 6. Chiều rộng chức năng Tìm kiếm đầu tiên
- 7. Độ phức tạp về thời gian tìm kiếm nhị phân đối với mảng không được phân loại
- 8. Tìm kiếm rộng đầu tiên hữu ích cho việc gì?
- 9. Độ phức tạp của thời gian tìm kiếm một lưu vực
- 10. Tìm kiếm topo và tìm kiếm theo chiều rộng đầu tiên
- 11. Độ phức tạp thời gian của random.sample
- 12. Phân tích các thuật toán cho độ phức tạp thời gian
- 13. Độ phức tạp của thời gian chạy bảng Hash (chèn, tìm kiếm và xóa)
- 14. phân tích jsons phức tạp với Aeson
- 15. Trie phức tạp và tìm kiếm
- 16. Độ phức tạp về thời gian đếm
- 17. Phân tích các thuật toán (phức tạp)
- 18. Độ phức tạp của thời gian nguyên trong Haskell
- 19. Tìm kiếm theo chiều rộng đầu tiên này có thể nhanh hơn không?
- 20. Maze giải quyết với tìm kiếm đầu tiên rộng
- 21. Các công cụ phân tích phức tạp mã vượt quá độ phức tạp của chu trình
- 22. Độ phức tạp về thời gian của hàm
- 23. Thời gian phức tạp của Sieve of Eratosthenes thuật toán
- 24. Phân loại cạnh trong quá trình tìm kiếm theo chiều rộng đầu tiên trên đồ thị có hướng
- 25. Tìm kiếm theo chiều rộng đầu tiên trên lưới 8x8 trong Java
- 26. Độ phức tạp thời gian của thuật toán Prim
- 27. Indexing/Tìm kiếm "phức tạp" JSON trong elasticsearch
- 28. Tại sao tìm kiếm rộng đầu tiên sử dụng nhiều bộ nhớ hơn chiều sâu đầu tiên?
- 29. Độ phức tạp về thời gian của việc xóa một nút trong cây nhị phân
- 30. Thời gian phức tạp của phương pháp HashMap
Điều này thực sự hữu ích sau 2 năm, cảm ơn! Nếu phần Eaj trong phương trình được bọc như O (Eaj) thì sao? – ajfigueroa