Bài giảng Cấu trúc dữ liệu và thuật toán - Chương 7: Đồ thị và các thuật toán đồ thị cung cấp cho người học các kiến thức: Biểu diễn đồ thị, các thuật toán duyệt đồ thị, một số ứng dụng của tìm kiếm trên đồ thị,... Mời các bạn cùng tham khảo nội dung chi tiết.
CHƯƠNG Đồ thị thuật toán đồ thị HCM HAN HP DAN NỘI DUNG Đồ thị Đồ thị vơ hướng, Đồ thị có hướng,Tính liên thơng đồ thị Biểu diễn đồ thị Biểu diễn đồ thị ma trận, Danh sách kề, Danh sách cạnh Các thuật tốn duyệt đồ thị Thuật tốn tìm kiếm theo chiều sâu, Thuật tốn tìm kiếm theo chiều rộng Một số ứng dụng tìm kiếm đồ thị Bài tốn đường đi, Bài tốn liên thơng, Đồ thị khơng chứa chu trình tốn xếp tơpơ, Bài tốn tơ màu đỉnh đồ thị Bài toán khung nhỏ Thuật toán Kruscal, Cấu trúc liệu biểu diễn phân hoạch, Bài toán đường ngắn Thuật toán Dijkstra, Cài đặt thuật toán với cấu trúc liệu Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN CuuDuongThanCong.com Đồ thị Đồ thị cặp (V, E), V tập đỉnh E họ cặp đỉnh gọi cạnh Ví dụ: Các đỉnh sân bay Các cạnh thể đường bay nối hai sân bay Các số cạnh chi phí (thời gian, khoảng cách) HAP DBP DAN HCM HAN BKK NHT VIN Nguyễn Đức Nghĩa - Bộ mơn KHMT ĐHBKHN Các kiểu cạnh Cạnh có hướng (Directed edge) Cặp có thứ tự gồm hai đỉnh (u,v) Đỉnh u đỉnh đầu Đỉnh v đỉnh cuối Ví dụ, chuyến bay Cạnh vơ hướng (Undirected edge) Cặp khơng có thứ tự gồm đỉnh (u,v) Ví dụ, tuyến bay Đồ thị có hướng (digraph) Các cạnh có hướng Ví dụ, mạng truyền tin Đồ thị vơ hướng (Undirected graph/graph) Các cạnh khơng có hướng Ví dụ, mạng tuyến bay Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN CuuDuongThanCong.com HAN flight VN 426 HCM HAN 1135 km HCM Ứng dụng Mạch lôgic (Electronic circuits) Phịng máy Mạch in Mạch tích hợp Phịng hành Mạng giao thơng (Transportation networks) Phịng máy Phòng Giáo vụ Mạng xa lộ Mạng tuyến bay Mạng máy tính (Computer networks) Mạng cục Internet Web Trường ĐHQG Ban Giám đốc Phòng Tuyên huấn Cơ sở liệu (Databases) Tổ Tin Sơ đồ quan hệ thực thể (Entity-relationship diagram) Bờm Cuội Chị Hằng Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN Thuật ngữ Đầu mút cạnh U V đầu mút cạnh a Cạnh kề với đỉnh a, d, b kề với đỉnh V Đỉnh kề U V kề Bậc đỉnh a X có bậc U V d e W j Z i g f h i cạnh lặp Khuyên h X c Cạnh lặp b Y j khuyên Đơn đồ thị: Không chứa cạnh lặp khuyên Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN CuuDuongThanCong.com Thuật ngữ (tiếp tục) Đường Dãy đỉnh (hoặc dãy cạnh), hai đỉnh liên tiếp có cạnh nối: P: s = v0, v1, , vk-1, vk = t, (vi-1, vi) cạnh đồ thị, i=1, 2, , k Độ dài đường số cạnh đường (k) s - đỉnh đầu t - đỉnh cuối đường P Đường đơn Các đỉnh đường phân biệt Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN Thuật ngữ (tiếp tục) V a U c b d P2 P1 X h Z e W g f Y Ví dụ P1= V,X,Z (dãy cạnh: b, h) đường đơn P2= U,W,X,Y,W,V) (P2=c,e,g,f,d) đường không đơn Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN CuuDuongThanCong.com Thuật ngữ (tiếp) Chu trình Đường gồm cạnh phân biệt có đỉnh đầu trùng đỉnh cuối Chu trình đơn Ngoại trừ đầu trùng cuối, khơng cịn hai đỉnh giống Ví dụ V a U b d C2 c X h e C1 g W C1= V,X,Y,W,U CT đơn C2=U,W,X,Y,W,V chu trinh không đơn f Z Y Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN Tính chất Tính chất Sv deg(v) = 2m CM: cạnh đếm lần Tính chất Ký hiệu n m deg(v) Trong đơn đồ thị vô hướng (đồ thị khơng có cạnh lặp khun) m n (n - 1)/2 CM: đỉnh có bậc khơng (n - 1) số đỉnh số cạnh bậc đỉnh v Ví dụ n=4 m=6 deg(v) = Tương tự có cận cho đồ thị có hướng CuuDuongThanCong.com Nguyễn Đức Nghĩa - Bộ mơn KHMT ĐHBKHN 10 Graph ADT Các phép toán (Basic Graph operations) khởi tạo/create (số đỉnh, isDirected) huỷ/destroy nhận số cạnh / get number of edges nhận số đỉnh / get number of vertices cho biết đồ thị có hướng hay vơ hướng / tell whether graph is directed or undirected bổ sung cạnh / insert an edge loại bỏ cạnh / remove an edge có cạnh nối hai đỉnh / tell whether an edge exists between two vertices duyệt đỉnh kề đỉnh cho trước / An iterator that process all vertices adjacent to a given vertex 11 Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN Các tốn xử lý đồ thị Tính giá trị số đặc trưng số đồ thị (số liên thơng, sắc số, ) Tìm số tập cạnh đặc biệt (chẳng hạn, cặp ghép, bè, chu trình, khung, ) Tìm số tập đỉnh đặc biệt (chẳng hạn, phủ đỉnh, phủ cạnh, tập độc lập, ) Trả lời truy vấn số tính chất đồ thị (liên thơng, phẳng, ) Các tốn tối ưu đồ thị: Cây khung nhỏ nhất, đường ngắn nhất, luồng cực đại mạng, Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN CuuDuongThanCong.com 12 Biểu diễn đồ thị 13 Nguyễn Đức Nghĩa - Bộ mơn KHMT ĐHBKHN Biểu diễn đồ thị Có nhiều cách biểu diễn, Việc lựa chọn cách biểu diễn phụ thuộc vào toán cụ thể cần xét, thuật tốn cụ thể cần cài đặt Có hai vấn đề cần quan tâm lựa chọn cách biểu diễn: Bộ nhớ mà cách biểu diễn đòi hỏi Thời gian cần thiết để trả lời truy vấn thường xuyên đồ thị trình xử lý đồ thị: Chẳng hạn: Có cạnh nối hai đỉnh u, v ? Liệt kê đỉnh kề đỉnh v ? Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN CuuDuongThanCong.com 14 Ma trận kề (Adjacency Matrix) n n ma trận A Các đỉnh đánh số từ đến |V| theo thứ tự 1 nÕu (i, j ) E A[i, j ] = aij = A xác nh bi: trái lại a b c d4 0 0 0 1 0 1 a b c d 4 1 1 1 1 1 A = AT đồ thị vô hướng 15 Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN Ma trận kề Chú ý sử dụng ma trận kề: Dịng tồn khơng ~đỉnh lập M[i, i] = khuyên (self-loop) Bộ nhớ (Space) |V |2 bits Các thông tin bổ sung, chẳng hạn chi phí cạnh, cần cất giữ dạng ma trận Thời gian trả lời truy vấn Hai đỉnh i j có kề nhau? O(1) Bổ sung loại bỏ cạnh O(1) Bổ sung đỉnh: tăng kích thước ma trận Liệt kê đỉnh kề v : O(|V|) (ngay v đỉnh cô lập) Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN CuuDuongThanCong.com 16 Ma trận trọng số Trong trường hợp đồ thị có trọng số cạnh, thay ma trận kề, để biểu diễn đồ thị ta sử dụng ma trận trọng số C = c[i, j], i, j = 1, 2, , n, víi c(i, j ), nÕu (i, j ) E c[i, j ] = nÕu (i, j ) E, , giá trị đặc biệt để cặp (i,j) không cạnh, tuỳ trường hợp cụ thể, đặt giá trị sau: 0, +, - 17 Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN Ma trận trọng số Ví dụ 8 Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN A = 8 CuuDuongThanCong.com 18 Danh sách kề (Adjacency List) Danh sách kề: Với đỉnh v cất giữ danh sách đỉnh kề Là mảng Adj gồm |V| danh sách Mỗi đỉnh có danh sách Với u V, Adj[u] bao gồm tất đỉnh kề u Ví dụ Đồ thị vô hướng u v w v u w w u v x z y v z x Đồ thị có hướng y a b b e c b c d t e b f f 19 Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN Biểu diễn đồ thị danh sách kề Yêu cầu nhớ: Đối với đồ thị có hướng: Tổng số phần tử tất danh sách kề out-degree(v) = |E | (out-degree(v) – số cung khỏi v) vV Tổng cộng nhớ: (|V |+|E |) Đối với đồ thị vô hướng: Tổng số phần tử tất danh sách kề degree(v) = 2|E | (degree(v) – số cạnh kề với v) vV Tổng cộng nhớ: (|V |+|E |) Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN CuuDuongThanCong.com 20 Cấu trúc liệu cho thuật tốn Kruskal • Thoạt tiên, ET rỗng Có |V| tplt, thành phần gồm 1đỉnh • Các tập khởi tạo là: {1} {2} {3} {4} {5} {6} {7} {8} • Nếu việc bổ sung cạnh (u, v) vào ET khơng tạo thành chu trình cạnh bổ sung ET r1 = find(u); r2 = find(v); if (r1 ≠ r2) then ET = ET (u,v); union(r1, r2); 111 Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN Cấu trúc liệu tập không giao (Disjoint-set Data Structures) Vấn đề đặt là: Cho tập V gồm n phần tử, ta cần xây dựng cấu trúc liệu biểu diễn phân hoạch tập V thành tập V1, V2, …, Vk hỗ trợ thực hiệu thao tác sau: Makeset(x): Tạo tập chứa phần tử x Union(x, y): Thay tập V V (trong x V i j i y Vj ) tập Vi Vj phân hoạch xét Find(x): Tìm tên r(V ) tập V chứa phần tử x i i Như vậy, Find(x) Find(y) trả lại giá trị x y thuộc tập phân hoạch Cấu trúc liệu đáp ứng yêu cầu có tên cấu trúc liệu Union-Find (hoặc Disjoint-set data structure) Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN CuuDuongThanCong.com 112 Cấu trúc liệu tập không giao (Disjoint-set Data Structures) Trước hết để biểu diễn tập X V, sử dụng cấu trúc có gốc: Chọn phần tử X làm gốc (tên tập X phần tử tương ứng với gốc), phần tử x X có biến trỏ parent[x] trỏ đến cha nó, x gốc parent[x] = x Ví dụ: Giả sử có V = {1, 2, 3, 4, 5, 6, 7, 8, 9} V1 = {1, 3, 4}, V2 = {2, 5, 6, 7, 9}, V3 = {8} Ta có ba mô tả ba tập V1, V2, V3 Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 113 Cấu trúc liệu tập không giao (Disjoint-set Data Structures) Mảng parent để biểu diễn rừng gồm tương ứng với V1, V2, V3: v parent[v] 2 Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN CuuDuongThanCong.com 8 114 Makeset(x) FindSet MakeSet(x) { parent[x] := x; } Thời gian: O(1) Find(x); { while x parent[x] x = parent[x]; return x; } Thời gian: O(h), h độ cao chứa x 115 Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN Cấu trúc liệu tập không giao (Disjoint-set Data Structures) Để nối tập chứa x tập chứa y chữa lại biến trỏ gốc chứa x trỏ đến gốc chứa y Điều thực nhờ thủ tục sau Union(x, y) { u:= Find(x); (* Tìm u gốc chứa x *) v:= Find(y); (* Tìm v gốc chứa y *) parent[u] := v; } Thời gian: O(h) Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN CuuDuongThanCong.com 116 Ví dụ Union(x,y) y a x w b r y a f x w b x trỏ đến y b, r f chìm xuống sâu y trỏ đến x a w chìm xuống sâu f r 117 Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN Phân tích độ phức tạp Có thể thấy thời gian tính hàm Find(x) phụ thuộc vào độ cao chứa x Trong trường hợp có k đỉnh có dạng đường độ cao k- Ví dụ: A B C D E Sau thực Union(A,B); Union(B,C); Union(C,D); Union(D,E) thu A B C D E Do hàm Find(x) có đánh giá thời gian tính O(n) Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN CuuDuongThanCong.com 118 Cấu trúc liệu tập không giao Liệu có cách để giảm độ cao con? Có cách thực đơn giản: Khi nối hai điều chỉnh trỏ gốc có đỉnh hơn, không thực việc nối cách tuỳ tiện Để ghi nhận số phần tử sử dụng thêm biến Num[v] chứa số phần tử với gốc v Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 119 MAKESET Union cải tiến MAKESET(x) { parent[x] := x; Num[x]:=1; } Union(x, y){ u:= Find(x); // Tìm u gốc chứa x v:= Find(y); // Tìm u gốc chứa y if Num[u] d[v] + c(v, w) Nếu đặt lại d[w] = d[v] + c(v, w) đặt p[w] = v Nguyễn Đức Nghĩa - Bộ mơn KHMT ĐHBKHN CuuDuongThanCong.com 130 Ví dụ Tìm đường ngắn từ đỉnh B đến đỉnh lại đồ thị sau 131 Nguyễn Đức Nghĩa - Bộ mơn KHMT ĐHBKHN Bảng tính toán theo thuật toán Dijkstra A Bước lặp B C D E F d p k d p k d p k d p k d p k d p k Khởi tạo - F - F - F - F - F - F B F - T B F - F - F - F B T A F - F - F - F A T C F C F - F C T C F 11 D F C T 11 D F T Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN CuuDuongThanCong.com E 132 Kết thực Tập cạnh {(p[v], v): v V-{B}} tạo thành gọi đường ngắn từ đỉnh B đến tất đỉnh cịn lại Cây cho hình vẽ sau đây: A B C D E F 133 Nguyễn Đức Nghĩa - Bộ mơn KHMT ĐHBKHN Cài đặt thuật tốn với cấu trúc liệu Để cài đặt thuật toán Dijkstra sử dụng nhãn đỉnh: Nhãn đỉnh v gồm thành phần cho biết thơng tin: k[v] - tìm đường ngắn từ đỉnh nguồn đến v hay chưa, d[v] - khoảng cách (độ dài đường đi) từ s đến v biết p[v] - đỉnh trước đỉnh v đường tốt biết Các thành phần cất giữ tương ứng biến k[v], d[v] p[v] Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN CuuDuongThanCong.com 134 Cài đặt trực tiếp Dijkstra_Table(G, s) for u V { d[u] infinity; p[u] NIL; k[u] FALSE; } d[s] 0; // s đỉnh nguồn T = V; while T ≠ { u đỉnh có d[u] nhỏ T; 10 k[u]=TRUE; 11 T = T–{u}; 12 for (v Adj(u)) && !k[v] 13 if d[v] > d[u] + c[u, v] { 14 d[v] = d[u] + c[u, v]; 15 p[v] = u; 16 } 17 } Dễ dàng nhận thấy Dijkstra_Table(G, s) đòi hỏi thời gian O(|V|2+|E|) 135 Nguyễn Đức Nghĩa - Bộ mơn KHMT ĐHBKHN Cài đặt thuật tốn Dijkstra sử dụng hàng đợi có ưu tiên Do bước ta cần tìm đỉnh với nhãn khoảng cách nhỏ nhất, nên để thực thao tác cách hiệu ta sử dụng hàng đợi có ưu tiên (Priority Queue – PQ) Dưới ta mô tả thuật tốn Dijkstra với hàng đợi có ưu tiên: Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN CuuDuongThanCong.com 136 Cài đặt thuật toán Dijkstra sử dụng PQ: Khởi tạo Dijkstra_Heap(G, s) for u V { d[u] infinity; p[u] NIL; k[u] FALSE; } d[s] 0; // s đỉnh nguồn Q Build_Min_Heap(d[V]); // Khởi tạo hàng đợi có ưu tiên Q từ d[V] = (d[v], vV) 137 Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN Cài đặt thuật toán Dijkstra sử dụng PQ: Lặp while Not Empty(Q) { u Extract-Min(Q); // loại bỏ gốc Q đưa vào u 10 k[u]=TRUE; 11 for (v Adj(u)) && !k[v] 12 if d[v] > d[u] + c[u, v] { 13 d[v] = d[u] + c[u, v]; 14 p[v] = u; 15 Decrease_Key(Q,v,d[v]); 16 } 17 } Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN CuuDuongThanCong.com 138 Phân tích thời gian tính thuật tốn Vịng lặp for dịng địi hỏi thời gian O(|V|) Việc khởi tạo đống đòi hỏi thời gian O(|V|) Vòng lặp while dòng lặp |V| lần thao tác ExtractMin thực |V| lần đòi hỏi thời gian O(|V| log|V|) Thao tác Decrease_Key dịng 15 phải thực khơng q O(|E|) lần Do thời gian thực thao tác thuật toán O(|E| log|V|) Vậy tổng cộng thời gian tính thuật tốn O((|E| + |V|) log|V|) 139 Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN Questions? Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN CuuDuongThanCong.com 140 ... H E Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN D CuuDuongThanCong.com 36 Q = {J,E,I,H} A B J F I C H E D 37 Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN Q = {E,I,H} A B J F I C H E Nguyễn Đức Nghĩa - Bộ... BFS-Visit(u) 31 Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN Ví dụ: Thực BFS(A) A B J F I C H E Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN D CuuDuongThanCong.com 32 Q = {A} A B J F I C H E D 33 Nguyễn Đức Nghĩa. .. 39 Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN Q = {H} A B J F I C H E Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN D CuuDuongThanCong.com 40 Q = {} Kết thúc BFS(A) A B J F I C H E D 41 Nguyễn Đức Nghĩa -