Thuật toán Breath First Search
Breath First Search (BFS) cùng với Depth First Search là những thuật toán cơ bản dùng để duyệt qua đồ thị. Trong bài viết này, chúng ta sẽ cùng làm rõ ý tưởng cũng như cách hiện thực thuật toán này.
Mục lục
1. Ý tưởng
Ý tưởng cơ bản như sau:
- Từ một đỉnh, ta tìm các đỉnh kề rồi duyệt qua các đỉnh này.
- Tiếp tục tìm các đỉnh kề của đỉnh vừa xét rồi duyệt tiếp đến khi đi qua hết tất cả các đỉnh có thể đi.
2. Hiện thực
Cách hiện thực thuật toán BFS cũng tương tự như DFS ở bài viết Thuật toán Depth First Search. Ta cần dùng một mảng marked
để kiểm tra xem một đỉnh đã được duyệt qua chưa. Ở đây, chúng ta dùng một queue
để lưu các đỉnh chưa xét đỉnh kề.
Đầu vào cần một Graph
và đỉnh gốc s
. Thực hiện các bước như sau:
- Đánh dấu điểm gốc
s
đã duyệt qua. - Thêm
s
vàoqueue
(vìs
chưa xét các đỉnh kề) - Nếu vẫn còn đỉnh để xét thì:
- Lấy đỉnh từ
queue
để xét các đỉnh kề của nó. - Lần lượt duyệt các đỉnh kề nếu nó chưa được duyệt qua. Trong quá trình duyệt qua, thêm đỉnh vào
queue
để chuẩn bị cho việc xét đỉnh kề của đỉnh đó.
- Lấy đỉnh từ
Code tham khảo:
- java
1 |
|
3. Áp dụng
Ta trở lại với bài toán trước ở bài viết Thuật toán Depth First Search.
Bài toán: Cho đồ thị
g
và đỉnh gốcs
. Trả lời câu hỏi, có đường đi nào từ đỉnh gốcs
tới một đỉnhw
nào đó không. Nếu có, hãy tìm đường đi đó.
Về ý tưởng thì tương tự, nhưng sẽ đổi lời giải bằng thuật toán BFS để xem kết quả nhé.
Code tham khảo:
- java
1 |
|
Thử nghiệm với đồ thị sau đây:
Hàm main
để test:
- java
1 |
|
Kết quả là:
[0]
[0, 1]
[0, 2]
[0, 3]
[0, 1, 4]
[0, 2, 5]
Và đường đi mà thuật toán cho kết quả là:
Có thể thấy, thuật toán BFS luôn cho đường đi ngắn nhất từ đỉnh gốc tới các đỉnh khác trong đồ thị vô hướng không có trọng số. “Ngắn” ở đây là qua ít đỉnh nhất nhé các bạn 😆.
4. Đánh giá
Thuật toán sẽ duyệt qua tất cả các đỉnh nếu đồ thị liên thông. Giống như DFS, BFS cũng là thuật toán tìm kiếm mù, mang tính chất vét cạn.
Bình luận
Cảm ơn bạn
Your comment has been submitted and will be published once it has been approved. 😊
OK