BFS (Breadth-First Search) là gì? Mô tả chi tiết
BFS (Breadth-First Search)
, hay còn gọi là tìm kiếm theo chiều rộng, là một thuật toán duyệt/tìm kiếm đồ thị hoặc cây, bắt đầu từ một nút gốc (root node) và khám phá tất cả các nút lân cận của nút gốc trước khi chuyển sang các nút ở cấp độ tiếp theo. Nói cách khác, BFS duyệt đồ thị theo từng lớp, từ lớp gần nút gốc nhất đến lớp xa nút gốc nhất.
Mô tả chi tiết thuật toán BFS:
1.
Khởi tạo:
– Chọn một nút làm nút gốc (starting node).
– Tạo một hàng đợi (queue) để lưu trữ các nút cần duyệt.
– Đánh dấu nút gốc là đã được thăm (visited).
– Đưa nút gốc vào hàng đợi.
2.
Lặp:
–
While
hàng đợi không rỗng:
– Lấy nút đầu tiên ra khỏi hàng đợi (dequeue). Gọi nút này là `currentNode`.
– Xử lý `currentNode` (ví dụ: in ra, kiểm tra điều kiện, …).
– Tìm tất cả các nút lân cận của `currentNode` chưa được thăm.
– Đánh dấu các nút lân cận này là đã được thăm.
– Đưa các nút lân cận này vào hàng đợi (enqueue).
Ví dụ:
Xét một đồ thị vô hướng sau:
“`
A
/
B C
/
D E F
“`
Nếu bắt đầu từ nút `A`, BFS sẽ duyệt theo thứ tự sau: `A, B, C, D, E, F`.
Ưu điểm của BFS:
Tìm đường đi ngắn nhất (Shortest Path):
BFS đảm bảo tìm được đường đi ngắn nhất (tính theo số cạnh) từ nút gốc đến bất kỳ nút nào khác trong đồ thị (nếu đường đi tồn tại).
Hoàn toàn:
Nếu một đường đi từ nút gốc đến một nút đích tồn tại, BFS đảm bảo sẽ tìm thấy đường đi đó.
Nhược điểm của BFS:
Tốn bộ nhớ:
BFS lưu trữ tất cả các nút ở cấp độ hiện tại trong hàng đợi, do đó có thể tốn nhiều bộ nhớ hơn so với các thuật toán khác như DFS (Depth-First Search), đặc biệt là đối với các đồ thị lớn.
Ứng dụng của BFS:
Tìm đường đi ngắn nhất trong đồ thị không trọng số:
Ví dụ: tìm đường đi ngắn nhất giữa hai thành phố trên bản đồ.
Tìm kiếm trên mạng xã hội:
Tìm bạn bè của bạn bè của bạn (degree of separation).
Web crawling:
Duyệt qua các trang web theo chiều rộng để lập chỉ mục.
Tìm kiếm trong mê cung:
Tìm đường ra khỏi mê cung.
Định tuyến IP:
Sử dụng để tính toán bảng định tuyến.
Ứng dụng trong trí tuệ nhân tạo:
Tìm kiếm giải pháp cho các bài toán.
Code ví dụ (Python):
“`python
from collections import deque
def bfs(graph, start_node):
“””
Thực hiện thuật toán BFS trên một đồ thị.
Args:
graph: Một từ điển (dictionary) biểu diễn đồ thị.
Key là một nút, Value là danh sách các nút lân cận của nút đó.
start_node: Nút gốc để bắt đầu tìm kiếm.
Returns:
Một danh sách các nút được duyệt theo thứ tự BFS.
“””
visited = set() Tập hợp các nút đã được thăm
queue = deque([start_node]) Hàng đợi để lưu trữ các nút cần duyệt
visited.add(start_node)
bfs_traversal_order = []
while queue:
node = queue.popleft() Lấy nút đầu tiên ra khỏi hàng đợi
bfs_traversal_order.append(node)
Tìm các nút lân cận của node
for neighbor in graph.get(node, []):
if neighbor not in visited:
visited.add(neighbor)
queue.append(neighbor)
return bfs_traversal_order
Ví dụ sử dụng
graph = {
A: [B, C],
B: [A, D, E],
C: [A, F],
D: [B],
E: [B, F],
F: [C, E]
}
start_node = A
bfs_result = bfs(graph, start_node)
print(“BFS traversal order:”, bfs_result) Output: BFS traversal order: [A, B, C, D, E, F]
“`
Tóm tắt:
BFS là một thuật toán duyệt đồ thị mạnh mẽ, đặc biệt hữu ích khi cần tìm đường đi ngắn nhất. Tuy nhiên, cần cân nhắc về vấn đề bộ nhớ khi sử dụng BFS trên các đồ thị lớn.
Từ khoá tìm kiếm:
BFS
Breadth-First Search
Thuật toán tìm kiếm theo chiều rộng
Duyệt đồ thị
Tìm đường đi ngắn nhất
Graph traversal
Shortest path algorithm
Tags:
Algorithms
Graph Theory
Data Structures
Searching
Breadth-First Search
BFS
Pathfinding
Shortest Path
Computer Science
Programming