BFS Duyệt đồ thị theo chiều rộng

22 146 1
BFS  Duyệt đồ thị theo chiều rộng

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

BFS Duyệt đồ thị theo chiều rộng Breadth First Search Trong lý thuyết đồ thị, tìm kiếm theo chiều rộng (BFS) là một thuật toán tìm kiếm trong đồ thị trong đó việc tìm kiếm chỉ bao gồm 2 thao tác: (a) cho trước một đỉnh của đồ thị; (b) thêm các đỉnh kề với đỉnh vừa cho vào danh sách có thể hướng tới tiếp theo. Có thể sử dụng thuật toán tìm kiếm theo chiều rộng cho hai mục đích: tìm kiếm đường đi từ một đỉnh gốc cho trước tới một đỉnh đích, và tìm kiếm đường đi từ đỉnh gốc tới tất cả các đỉnh khác. Trong đồ thị không có trọng số, thuật toán tìm kiếm theo chiều rộng luôn tìm ra đường đi ngắn nhất có thể. Thuật toán BFS bắt đầu từ đỉnh gốc và lần lượt nhìn các đỉnh kề với đỉnh gốc. Sau đó, với mỗi đỉnh trong số đó, thuật toán lại lần lượt nhìn trước các đỉnh kề với nó mà chưa được quan sát trước đó và lặp lại. Xem thêm thuật toán tìm kiếm theo chiều sâu, trong đó cũng sử dụng 2 thao tác trên nhưng có trình tự quan sát các đỉnh khác với thuật toán tìm kiếm theo chiều rộng.

Duyệt đồ thị theo chiều rộng - Breadth-First Search (BFS) Thuật toán sử dụng cấu trúc liệu hàng đợi để lưu trữ thông tin trung gian thu trình tìm kiếm: Chèn đỉnh gốc vào hàng đợi Lấy đỉnh hàng đợi quan sát Nếu đỉnh duyệt, khơng làm cả, quay lại bước Nếu đỉnh chưa duyệt chèn tất đỉnh chưa duyệt kề với vào hàng đợi 3.Hàng đợi rỗng dừng Nếu hàng đợi khơng rỗng quay bước Sử dụng mảng Đã duyệt, mảng Lưu vết Squeue • DaDuyet[i] = > đỉnh i chưa duyệt • DaDuyet[i] = t > đỉnh i duyệt theo thứ tự t • LuuVet[i] = k > đỉnh i đến từ đỉnh k • Nếu i đỉnh bắt đầu LuuVet[i] = • Squeue: Lưu lại đỉnh chuẩn bị xem xét • Xem ví dụ minh họa slide sau: BFS Đã duyệt 10 11 12 0 0 0 0 0 Lưu vết - - Squeue - - - - - - - - - - t=1 12 11 10 BFS Đã duyệt 10 11 12 0 0 0 0 0 Lưu vết - - - - - - - Squeue - - - - - pop() -> 1 12 11 10 BFS Đã duyệt 10 11 12 0 0 0 Lưu vết - 1 - - - - Squeue 12 - - - - Nếu DaDuyet[2] = push(2) DaDuyet[2] = t++, LuuVet[2]=1 Nếu DaDuyet[4] = push(4) DaDuyet[4] = t++, LuuVet[4]=1 Nếu DaDuyet[12] = push(12) DaDuyet[12] = t++, LuuVet[12]=1 12 11 10 BFS Đã duyệt 10 11 12 0 0 0 Lưu vết - 1 - - - - Squeue 12 - - - - pop() -> 12 11 10 BFS Đã duyệt 10 11 12 0 0 0 Lưu vết - 1 - - - - Squeue 12 Nếu DaDuyet[1] = = Khơng làm Nếu DaDuyet[4] = = Khơng làm - - - - 12 11 10 BFS Đã duyệt 10 11 12 0 0 0 Lưu vết - 1 - - - - Squeue 12 - - - - pop() -> 12 11 10 BFS Đã duyệt 10 11 12 0 0 Lưu vết - 1 - - 4 - - - - Squeue 12 Nếu DaDuyet[6] = push(6) DaDuyet[6] = t++, LuuVet[6]=4 Nếu DaDuyet[7] = push(7) DaDuyet[7] = t++, LuuVet[6]=4 12 11 10 BFS Đã duyệt 10 11 12 0 0 Lưu vết - 1 - - 4 - - - - Squeue 12 pop() -> 12 12 11 10 BFS Đã duyệt 10 11 12 0 Lưu vết 12 1 - - 4 - - - 12 Squeue 12 11 Nếu DaDuyet[0] = push(0) DaDuyet[0] = t++, LuuVet[0]=12 Nếu DaDuyet[11] = push(11) DaDuyet[11] = t++, LuuVet[11]=12 12 11 10 BFS Đã duyệt 10 11 12 0 Lưu vết 12 1 - - 4 - - - 12 Squeue 12 11 pop() -> 12 11 10 BFS Đã duyệt 10 11 12 0 10 Lưu vết 12 1 - 4 - - 12 Squeue 12 11 10 Nếu DaDuyet[5] = push(5) DaDuyet[5] = t++, LuuVet[5]=6 Nếu DaDuyet[10] = push(10) DaDuyet[10] = t++, LuuVet[10]=6 12 11 10 BFS Đã duyệt 10 11 12 0 10 Lưu vết 12 1 - 4 - - 12 Squeue 12 11 10 pop() -> 7 12 11 10 BFS Đã duyệt 10 11 12 11 0 10 Lưu vết 12 1 4 - - 12 Squeue 12 11 10 Nếu DaDuyet[3] = push(3) DaDuyet[3] = t++, LuuVet[3]=7 12 11 10 BFS Đã duyệt 10 11 12 11 0 10 Lưu vết 12 1 4 - - 12 Squeue 12 11 10 pop() -> pop() -> 11 12 11 10 BFS Đã duyệt 10 11 12 11 0 10 Lưu vết 12 1 4 - - 12 Squeue 12 11 10 pop() -> 12 11 10 BFS Đã duyệt 10 11 12 11 12 13 10 Lưu vết 12 1 4 5 12 Squeue 12 11 10 Nếu DaDuyet[8] = push(8) DaDuyet[8] = t++, LuuVet[8]=5 Nếu DaDuyet[9] = push(9) DaDuyet[9] = t++, LuuVet[9]=5 12 11 10 BFS Đã duyệt 10 11 12 11 12 13 10 Lưu vết 12 1 4 5 12 Squeue 12 11 10 pop() -> 10 12 11 10 BFS Đã duyệt 10 11 12 11 12 13 10 Lưu vết 12 1 4 5 12 Squeue 12 11 10 pop() -> 3 12 11 10 BFS Đã duyệt 10 11 12 11 12 13 10 Lưu vết 12 1 4 5 12 Squeue 12 11 10 pop() -> pop() -> Squeue rổng -> Dừng 12 11 10 BFS Đã duyệt 10 11 12 11 12 13 10 Lưu vết 12 1 4 5 12 Squeue 12 11 10 Thứ tự duyệt: dựa vào mảng Đã duyệt ta có thứ tự duyệt: Đỉnh: 1, 2, 4, 12, 6, 7,0, 11, 5, 10, 3, 8, 12 11 10 ... slide sau: BFS Đã duyệt 10 11 12 0 0 0 0 0 Lưu vết - - Squeue - - - - - - - - - - t=1 12 11 10 BFS Đã duyệt 10 11 12 0 0 0 0 0 Lưu vết - - - - - - - Squeue - - - - - pop() -> 1 12 11 10 BFS Đã duyệt... 10 BFS Đã duyệt 10 11 12 11 0 10 Lưu vết 12 1 4 - - 12 Squeue 12 11 10 pop() -> pop() -> 11 12 11 10 BFS Đã duyệt 10 11 12 11 0 10 Lưu vết 12 1 4 - - 12 Squeue 12 11 10 pop() -> 12 11 10 BFS. .. 11 10 BFS Đã duyệt 10 11 12 11 12 13 10 Lưu vết 12 1 4 5 12 Squeue 12 11 10 pop() -> 10 12 11 10 BFS Đã duyệt 10 11 12 11 12 13 10 Lưu vết 12 1 4 5 12 Squeue 12 11 10 pop() -> 3 12 11 10 BFS

Ngày đăng: 20/08/2020, 10:09

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan