Bài giảng Cấu trúc và dữ liệu giải thuật - Chương 5: Đồ thị - Phạm Thanh An
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Cấu trúc và dữ liệu giải thuật - Chương 5: Đồ thị - Phạm Thanh An", để 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_cau_truc_va_du_lieu_giai_thuat_chuong_5_do_thi_pha.ppt
Nội dung text: Bài giảng Cấu trúc và dữ liệu giải thuật - Chương 5: Đồ thị - Phạm Thanh An
- Chương 5: ĐỒ THỊ Ths. Phạm Thanh An Bộ môn Khoa học máy tính - Khoa CNTT Trường Đại học Ngân hàng TP.HCM LOGO
- Mục tiêu của chương ❖Trình bày những kiến thức căn bản về lý thuyết đồ thị, cách biểu diễn, một số thuật toán trên đồ thị ❖Đánh giá thuật toán ❖Một số ứng dụng của đồ thị
- Định nghĩa Anchorage Boston Minneapolis Seattle Hartford SF Austin Atlanta
- Định nghĩa ❖Đồ thị G = (V,E) ▪ V = tập hợp hữu hạn các phần tử (đỉnh hay nút) ▪ E V × V, tập hữu hạn các cạnh (cung) a b Đỉnh c Cung d e
- Các khái niệm ❖ Nếu (x,y) E • x gọi là đỉnh gốc, y là ngọn • Nếu x ≡ y, (x,y) gọi là khuyên ❖ Một dãy u1,u2, ,un, ui V (i=1,n) gọi là một đường, nếu (ui-1,ui) E ❖ Độ dài đường: length(u1,u2, ,un)=n ❖ (u1,u2, ,un) đường đi đơn, nếu ui≠uj, 1<i≠j<n (là đường đi, mà các đỉnh phân biệt, ngoại trừ đình đầu và đỉnh cuối)
- Các khái niệm (tt) ❖Chu trình (cycle) = (u1,u2, ,un), u1≡ un ❖Đồ thị định hướng (directed graph) ▪ (x,y) E : (x,y) ≠ (y,x) ❖Đồ thị vô hướng ▪ (x,y) E : (y,x) E ▪ (x,y) ≡ (y,x)
- Các khái niệm (tt) ❖CBDC là một chu trình B B A C A C Đường đi đơn D D Chu trình
- Các khái niệm (tt) Đồ thị vô hướng Đồ thị định hướng
- Các khái niệm (tt) ❖Tính liên thông (connectivity) ▪ Trong đồ thị G, hai đỉnh x,y gọi là liên thông (connected), nếu có một đường từ x đến y ▪ Đồ thị G liên thông, nếu (x,y) E, đường đi từ x đến y ❖Đồ thị G gọi là có trọng số, nếu mỗi cung được gán một giá trị số đặc trưng
- Các khái niệm (tt) Đồ thị liên thông Đồ thị không liên thông
- Các khái niệm (tt) ❖Đồ thị có trọng số 0 10 20 1 1 2 4 5 3
- Biểu diễn đồ thị ❖Biểu diễn bằng ma trận kề ▪ Adjacency matrice ❖Biểu diễn bằng danh sách kề ▪ Adjacency list
- Biểu diễn bằng ma trận kề ❖Xét G=(V,E) với V={x1, ,xn} ❖Biểu diễn G bằng ma trận A=(aij), i,j=1 n ▪ aij=1, nếu Ǝ (xi,xj) E ▪ aij=0, nếu !Ǝ (xi,xj) E
- Biểu diễn bằng ma trận kề(tt) A[i][j] 0 1 2 3 0 0 0 1 1 0 1 1 0 1 1 1 2 1 1 0 1 2 3 0 1 1 0 3 0 1 1 0 1 0 1 1 A = 1 1 0 1 0 1 1 0
- Biểu diễn bằng ma trận kề(tt) A[i][j] 0 1 2 3 0 0 1 1 1 0 1 0 0 0 1 2 0 0 0 1 1 2 3 0 0 0 0 3 0 1 1 1 A = 0 0 0 1 0 0 0 1 0 0 0 0
- Biểu diễn bằng ma trận kề(tt) x2 0 1 1 0 0 0 0 0 0 1 x1 x3 0 1 0 0 0 0 0 1 0 0 x x5 4 1 0 0 1 0
- Biểu diễn bằng ma trận kề (tt) x2 0 1 1 0 0 0 0 0 1 1 x1 x3 0 1 0 0 0 0 1 1 0 0 x x5 4 1 0 0 1 1
- Biểu diễn bằng ma trận kề (tt) A[i][j] 0 1 2 3 0 0 20 10 1 1 20 0 0 5 0 20 2 10 0 0 4 10 3 1 5 4 0 1 1 2 5 0 20 10 1 4 20 0 0 5 3 A = 10 0 0 4 1 5 4 0
- Biểu diễn bằng ma trận kề (tt) ❖Chú ý ▪ Đối với đồ thị không định hướng, ma trận kề là ma trận đối xứng ▪ Đối với đồ thị định hướng, số lượng phần tử 0 khá lớn ▪ Đối với đồ thị có trọng số, thay thế giá trị 1 bằng giá trị trọng số
- Biểu diễn đồ thị bằng danh sách kề ❖Là một mảng các danh sách ❖Ở đây, n hàng của ma trận kề thay thế bằng n danh sách liên kết động ❖Mỗi đỉnh của G có một danh sách, mỗi nút trong danh sách thể hiện các đỉnh lân cận của nút này ▪ Cấu trúc mỗi nút • id: tên đỉnh (chỉ số, danh hiệu) • next: con trỏ đến nút kế tiếp
- Biểu diễn đồ thị bằng danh sách kề (tt) 0 1 2 3 0 1 3 1 2 3 2 3 3
- Biểu diễn đồ thị bằng danh sách kề (tt) x 2 x[1] 2 3 x1 x3 x[2] 5 x[3] 2 x[4] 3 x x4 5 x[5] 1 4
- Biểu diễn đồ thị bằng danh sách kề (tt) 0 0 1 10 2 20 3 1 10 20 1 0 10 3 4 1 1 2 2 0 20 3 5 4 5 3 3 0 1 1 4 2 5
- Biểu diễn đồ thị bằng danh sách kề (tt) ❖Chú ý ▪ Các nút đầu danh sách được lưu vào một mảng (truy cập nhanh) ▪ Với đồ thị không định hướng có n đỉnh và e cạnh, thì cần n nút đầu và 2e nút ‘trong’ danh sách ▪ Với đồ thị định hướng có n đỉnh và e cạnh, thì chỉ cần e nút ‘trong’ danh sách ▪ Thứ tự các nút không quan trọng
- Phép duyệt đồ thị ❖Từ một đỉnh, liệt kê tất cả các đỉnh của đồ thị ▪ Phép tìm kiếm theo chiều sâu • Depth first search ▪ Phép tìm kiếm theo chiều rộng • Breadth first search
- Phép tìm kiếm theo chiều sâu ❖Ý tưởng ▪ Tại đỉnh v bất kỳ, duyệt đỉnh v, và xét tập các đỉnh đến được từ đỉnh v ▪ Lập lại thao tác trên đối với đỉnh w bất kỳ trong tập các đỉnh từ v nói trên
- Phép tìm kiếm theo chiều sâu (tt) x2 x1 x3 x43 x4 x3251 x5 x12
- Phép tìm kiếm theo chiều sâu (tt) ❖Nhận xét ▪ Thời gian thực hiện giải thuật ~ (n+e), nếu G được biểu diễn bằng danh sách kề ▪ Thời gian thực hiện giải thuật ~ n2, nếu G được biểu diễn bằng ma trận kề ▪ Giải thuật này sử dụng để chứng minh một đồ thị có liên thông hay không
- Phép tìm kiếm theo chiều rộng ❖ Tại điểm v bất kỳ, duyệt đỉnh v, thu được tập hợp W gồm các đỉnh w xuất phát từ v ❖ Lặp lại thao tác trên đối với tất cả các đỉnh w trong W, thu được tập hợp đỉnh Z ❖ Lặp lại thao tác trên đối với tất cả các đỉnh z trong Z ❖ Lặp lại cho đến khi tất cả mọi đỉnh đều được duyệt qua ít nhất một lần
- Phép tìm kiếm theo chiều rộng(tt) x1 x2 x3 x5 x2 x1 x4 x2 x1 x3 x4 x5
- Phép tìm kiếm theo chiều rộng(tt) ❖Nhận xét ▪ Thời gian thực hiện giải thuật ~ (n+e), nếu G được biểu diễn bằng danh sách kề ▪ Thời gian thực hiện giải thuật ~ n2, nếu G được biểu diễn bằng ma trận kề
- Cây khung (Spanning tree) ❖T=(V,E’) G=(V,E), với E E’ bao gồm các cung thuộc một phép duyệt từ một đỉnh đến các đỉnh còn lại trong V ❖Giá của cây khung T = tổng trọng số của các cung thuộc E’ Cây khung T Đồ thị G của đồ thị G
- Cây khung (Spanning tree) ❖Chú ý ▪ Một đồ thị G có thể có nhiều cây khung ▪ Cây khung theo chiều rộng, theo chiều sâu ▪ Các cung trong cây khung không tạo nên chu trình • Giữa hai đỉnh trong một cây khung chỉ tồn tại duy nhất một đường đi từ đỉnh này đến đỉnh kia ▪ Nếu đồ thị có n đỉnh, thì cây khung có n-1 cạnh
- Cây khung cực tiêu ❖ Là cây khung với tổng các trọng số là cực tiểu 6 6 10 10 1 7 1 20 5 5
- Thuật toán Kruskal ❖Sắp xếp các cung theo thứ tự không giảm đối với trọng số ❖Bắt đầu từ T=Ø ❖Lặp cho đến khi ko còn đỉnh nào ( |E’| = n-1) ▪ lấy ra cung w có trọng số nhỏ nhất ▪ thêm cung w vào T với điều kiện không tạo chu trình trong T
- Cây khung (Spanning tree) ❖Ví dụ: Cho một đồ thị G vô hướng, liên thông, có trọng số. Hãy tìm cây khung cực tiểu của G x 9 x2 x6 x1 x3 x7 x 8 x x5 4
- Thuật toán Kruskal ❖Để kiểm tra xem có tạo ra chu trình trong T hay không, chúng ta xem hai đỉnh của cung được thêm có thuộc tập các đỉnh hiện có trong T không, nếu có, nghĩa là sẽ tạo nên chu trình
- Bài toán bao đóng truyền ứng ❖Cho đồ thị G = (V,E) ▪ Có tồn tại đường đi giữa hai nút x và y trong đồ thị G hay không? ▪ Bài toán này có thể giải được dễ dàng bằng cách sử dụng ma trận kề của đồ thị
- Bài toán bao đóng truyền ứng ❖Ma trận kề A của đồ thị G=(V,E) ▪ aij=true, nếu Ǝ (xi,xj) E ▪ aij=false, nếu ngược lại ❖Phép cộng A=(aij), B=(bij) ▪ A V B = C, với cij=aij V bij ❖Phép nhân A=(aij), B=(bij) ▪ D =A Λ B, với dij=V(aiknΛbkj) Với 1<=i, j, <=n k=1
- Bài toán bao đóng truyền ứng ❖Với ma trận A, nếu aij =1, có nghĩa là có một cung từ i tới j. ❖Xét A(2) = A Λ A. Rõ ràng nếu phần tử ở hàng i, cột j của A(2) bằng 1, thì có ít nhất có một đường đi có độ dài 2, từ đỉnh i đến đỉnh j, vì (2) a ij = V (aik Λ akj) n ▪ aik Λ akj =1, khi aik =1 và akj =1, => tức là có đườngk=1 đi độ dài 1 từ i tới k và có đường đi đô dài 1 từ k tới j
- Bài toán bao đóng truyền ứng ❖Từ đó suy ra A(r) = A Λ A(r-1), R=2, 3, (r) Nghĩa là a ij = 1, thì có ít nhất 1 đường đi đô dài r, từ i tới j. ❖Ta lập ma trân P = A V A(2) V V A(n) ❖ Thì P sẽ cho biết có hay không một đường đi có độ dài lớn nhất là n, từ đỉnh i tới j. P được gọi là ma trận đường đi.
- Bài toán bao đóng truyền ứng ❖Thuật toán WARSHALL Void WARSHALL(A, P, n){ For (int k=0;k<n;k++) For (int i=0;i<n;i++) For (int j=0;j<n;j++) P[i,j]=P[i,j] V (P[i,k] Λ P[k,j]) }
- Bài toán đường đi ngắn nhất ❖Vấn đề ▪ Cho một đồ thị định hướng, liên thông, có trọng số G ▪ Hãy tìm đường đi ngắn nhất từ một đỉnh đến tất cả các đỉnh khác trong đồ thị
- Thuật toán Dijkstra ❖Xét đồ thị có hướng G=(V,E), với |V|=n ❖Ma trận trọng số d[u,v]≥0, (u,v) E ❖s V là điểm xuất phát ❖H[v]=chiều dài cực tiểu từ s đến v (v V)
- Thuật toán Dijkstra ❖ Bắt đầu duyệt từ đỉnh s ❖ Gán giá trị cho H[v] ▪ H[v]=d(s,v), nếu (s,v) E ▪ H[v]=∞, nếu ngược lại ❖ Lặp lại cho đến khi duyệt hết các đỉnh ▪ Chọn đỉnh w chưa duyệt có H[w] nhỏ nhất ▪ Duyệt đỉnh w này ▪ Với các đỉnh t chưa duyệt khác • H[t] = min(H[t],H[w]+d(w,t))
- Thuật toán Dijkstra ❖Hoạt động tốt trên đồ thị trọng số dương ❖Độ phức tạp giải thuật là O(n2)
- Thuật toán Dijkstra ❖Tìm đường đi từ v0 tới các đỉnh còn lại from node V to other 1 node 0 1 3 nodes 10 2 3 V 10 0 9 4 6 1 source V2 5 5 7 2 4 V 2 3 V4 best
- Thuật toán Dijkstra step 1: tìm đường đi ngắn nhất từ 0 ◼ node 2 được chọn from node V to other 1 node 0 1 3 nodes 10 2 3 V 10 0 9 4 6 1 source V2 5 5 7 2 4 V 2 3 V4 best V2
- Thuật toán Dijkstra step 2: Tính toán lại các đường đi đến tẩt cả các đỉnh ◼ Tìm đường đi ngắn nhất đến node 0. Node 4 được chọn from node V to other node 0 nodes 1 1 3 10 V1 10 8 2 3 9 0 4 6 V2 5 5 source 5 7 V3 14 2 4 2 V4 7 best V2 V4
- Thuật toán Dijkstra step 2: Tính toán lại các đường đi đến tẩt cả các đỉnh ◼ Tìm đường đi ngắn nhất từ node 0. node 1 được chọn from node V to other node 0 1 nodes 1 3 10 V1 10 8 8 2 3 0 9 4 6 V2 5 5 5 source 7 5 V3 14 13 2 4 2 V4 7 7 best V2 V4 V1
- Thuật toán Dijkstra step 2: Tính toán lại các đường đi đến tẩt cả các đỉnh ◼ Tìm đường đi ngắn nhất từ node 0. node 3 được chọn from node V to other node 0 nodes 1 1 3 10 V1 10 8 8 8 2 3 0 9 4 6 V2 5 5 5 5 source 7 5 V3 14 13 9 2 4 2 V4 7 7 7 best V2 V4 V1 V3
- Thuật toán Dijkstra ❖ Chúng ta có tất cả các node from node V0 to other nodes đường đi từ v 0 8 8 V 10 8 1 (0,2) (0,2) 1 1 3 5 10 V 5 5 5 2 (0,2) 2 3 9 0 4 6 14 13 9 source V3 (0,2,3 (0,2,4, (0,2,1, 5 7 ) 3) 3) 2 4 2 7 V4 (0,2,4 7 7 ) best V2 V4 V1 V3