Bài giảng Lý thuyết đồ thị - Chương 3: Duyệt đồ thị - Trần Cao Đệ
Bạn đang xem tài liệu "Bài giảng Lý thuyết đồ thị - Chương 3: Duyệt đồ thị - Trần Cao Đệ", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- bai_giang_ly_thuyet_do_thi_chuong_3_duyet_do_thi_tran_cao_de.ppt
Nội dung text: Bài giảng Lý thuyết đồ thị - Chương 3: Duyệt đồ thị - Trần Cao Đệ
- Chương 3 Duyệt đồ thị
- Nội dung ⚫ Khái niệm duyệt đồ thị ⚫ Thuật toán duyệt đồ thị ⚫ Duyệt đồ thị theo chiều sâu ⚫ Duyệt đồ thị theo chiều rộng
- Duyệt đồ thị là gì? ⚫ Duyệt đồ thị là một cách liệt kê tất cả các đỉnh của đồ thị thành một danh sách tuyến tính. - Cho một cách “đi qua” tất cả các đỉnh của đồ thị để truy nhập, thêm bớt thông tin - Duyệt đồ thị không phụ thuộc vào hướng của cạnh.
- Ví dụ 3 2 D 4 B H 1 5 A E 8 G 6 C 7 F Thứ tự duyệt: A, B, D, H, E, G, F, C
- Thuật toán duyệt ⚫ Cho đồ thị G = (V, E) với x0 là một đỉnh của G. ⚫ Dùng một cấu trúc dữ liệu kiểu danh sách, kí hiệu là DS, để chứa các đỉnh.
- Thuật toán duyệt (tt) ⚫ Thuật toán 1) Khởi đầu: DS {x0} 2) Lấy đỉnh x ra khỏi đầu DS 3) Duyệt đỉnh x 4) Nạp các đỉnh của F(x) vào DS 5) Nếu DS thì quay lên bước 2) 6) Dừng.
- Duyệt chiều sâu (Depth First Search) ⚫ Danh sách DS được tổ chức theo kiểu stack (danh sách vào sau – ra trước – LIFO). ⚫ Mỗi lần duyệt một đỉnh ta duyệt đến tận cùng mỗi nhánh rồi mới chuyển sang duyệt nhánh khác.
- Ví dụ (DFS)
- Tư tưởng giải thuật 1. Bắt đầu duyệt từ một đỉnh x0 nào đó của đồ thị. 2. Chọn x là đỉnh kề nào đó của x0 và lặp lại quá trình duyệt đối với đỉnh x. Giả sử đang xét đỉnh x. - Nếu tìm được đỉnh y chưa được duyệt thì xét đỉnh này và bắt đầu từ đó tiếp tục quá trình duyệt - Nếu không còn đỉnh kề với x chưa được duyệt thì nói rằng đỉnh x đã duyệt xong, quay trở lại tiếp tục duyệt từ đỉnh mà từ đó đến được đỉnh x - Nếu quay trở lại đúng đỉnh x0 thì phép duyệt kết thúc
- Giải thuật DFS ⚫ Thuật toán 6.1 (Depth-First Search) Dữ liệu: Biểu diễn mảng DK các danh sách kề của đồ thị vô hướng G. Kết quả: Danh sách các đỉnh của đồ thị G.
- Giải thuật DFS (tt) Thuật toán 6.1 1 procedure D_SAU (v) ; 2 begin 3 Thăm_đỉnh (v) ; 4 Duyet [v] := true ; 5 for u DK[v] do 6 if ! Duyet [u] then D_SAU (u) ; 7 end ; 8 BEGIN { Chương trình chính } 9 for v V do Duyet [v] := false ; 10 for v V do 11 if ! Duyet [v] then D_SAU (v) 12 END.
- Giải thuật DFS (tt) Nhận xét: - Độ phức tạp: O(n+m) - Đỉnh được thăm càng muộn càng sớm trở thành duyệt xong. - Dùng một ngăn xếp lưu trữ các đỉnh đang duyệt để cải tiến thuật toán
- Giải thuật DFS (tt) Thuật toán cải tiến: 1 procedure D_SAU_2 (v) ; 2 begin 3 S := ; 4 Thăm_đỉnh (v) ; 5 Duyet [v] := true ; 6 push v onto S ; {Nạp v lên đỉnh của S } 7 while S do 8 begin 9 while u DK[top(S)] do 10 if ! Duyet [u] then 11 begin 12 Thăm_đỉnh (u) ; 13 Duyet [u] := true ; 14 push u onto S 15 end ; 16 pop(S) {Loại bỏ phần tử ở đỉnh của S} 17 end 18 end ;
- Ví dụ ⚫ Kết quả duyệt chiều sâu: 2 5 8 1 6 3 9 4 7 10
- Giải thuật BFS (Breadth First Search) ⚫ Danh sách DS được tổ chức theo kiểu hàng đợi (danh sách vào trước - ra trước – FIFO). - Việc duyệt có tính chất “lan rộng”. - Đỉnh được duyệt xong ngay sau khi ta đã xét hết tất cả các đỉnh kề với nó. - Đỉnh được xét càng sớm thì sớm trở thành duyệt xong.
- Ví dụ 8 9 11 1 2 5 4 6 1 3 10 1 15 2 7 13 4
- Giải thuật BFS ⚫ Thuật toán 6.3 (Breadth-First Search ) 1 procedure D_RONG (v) ; 2 begin 3 Q := ; 4 enqueue v into Q ; { Nạp v vào cuối hàng đợi Q } 5 Duyet [v] := true ; 6 while Q do 7 begin 8 dequeue z from Q ; { Loại z ra khỏi đầu hàng đợi Q} 9 Thăm_đỉnh (z) ; 10 for u DK[z] do 11 if ! Duyet [u] then 12 begin 13 enqueue u into Q ; 14 Duyet [u] := true 15 end 16 end 17 end ;
- Ví dụ 2 5 8 1 6 3 9 4 7 10