Chng 4 Bi ton cy khung nh nht
Chương 4 Bài toán cây khung nhỏ nhất The Minimum Spanning Tree Problem
Nội dung 4. 1. Cây và các tính chất cơ bản của cây 4. 2. Cây khung của đồ thị 4. 3. Xây dựng tập các chu trình cơ bản của đồ thị 4. 4. Xây dựng cây theo chiều sâu và chiều rộng 4. 5. Bài toán cây khung nhỏ nhất 2
Cây và rừng (Tree and Forest) u u Định nghĩa 1. Ta gọi cây là đồ thị vô hướng liên thông không có chu trình. Đồ thị không có chu trình được gọi là rừng. Như vậy, rừng là đồ thị mà mỗi thành phần liên thông của nó là một cây. T 1 T 2 Rừng F gồm 3 cây T 1, T 2, , T 3 3
VÍ DỤ G 1, G 2 là cây G 3, G 4 không là cây 4
Các tính chất cơ bản của cây Định lý 1. Giả sử T=(V, E) là đồ thị vô hướng n đỉnh. Khi đó các mệnh đề sau đây là tương đương: MĐ 1: T là cây ( T liên thông và không chứa chu trình ). MĐ 2: T không chứa chu trình và có n-1 cạnh. MĐ 3: T liên thông và có n-1 cạnh. MĐ 4: T liên thông và mỗi cạnh của nó đều là cầu. MĐ 5: Hai đỉnh bất kỳcủa T được nối với nhau bởi đúng 1 đường đi đơn. MĐ 6: T không chứa chu trình nhưng hễcứthêm vào nó một cạnh ta thu được đúng 1 chu trình. u 5
Nội dung 4. 1. Cây và các tính chất cơ bản của cây 4. 2. Cây khung của đồ thị 4. 3. Xây dựng tập các chu trình cơ bản của đồ thị 4. 4. Xây dựng cây theo chiều sâu và chiều rộng 4. 5. Bài toán cây khung nhỏ nhất 6
Cây khung của đồ thị u Định nghĩa 2. Giả sử G=(V, E) là đồ thị vô hướng liên thông. Cây T=(V, F) với F E được gọi là cây khung của đồ thị G. b b c a d e G c a b d c a e T 1 d e T 2 Đồ thị G và 2 cây khung T 1 và T 2 của nó 7
Số lượng cây khung của đồ thị Arthur Cayley (1821 – 1895) u Định lý sau đây cho biết số lượng cây khung của đồ thị đầy đủ Kn: u Định lý 2 (Cayley). Số cây khung của đồ thị Kn là nn-2. b a c K 3 a b c a c a b Ba cây khung của K 3 8
H methane H propane C H H C H H H H H ethane H C H H butane H saturated hydrocarbons Cn. H 2 n+2 9
Cây như là các mô hình n Khi n = 4, có đúng 2 cây không đẳng cấu, vậy có đúng 2 đồng phân dạng C 4 H 10 H H C C C H H H H H Butan C H H H C H H Isobutan H 10
Ví dụ: u Các cây khung của đồ thị: l l l abc, bcd, cda, dab, afc, dfb, aec, deb, aed, afb, bec, cfd, efc, efd, efa, efb. Số cây khung là: 42= 16 11
Nội dung 4. 1. Cây và các tính chất cơ bản của cây 4. 2. Cây khung của đồ thị 4. 3. Xây dựng tập các chu trình cơ bản của đồ thị 4. 4. Xây dựng cây theo chiều sâu và chiều rộng 4. 5. Bài toán cây khung nhỏ nhất 12
Tập các chu trình cơ bản § § § Định nghĩa: Giả sử G=(V, E) là đơn đồ thị vô hướng liên thông, H=(V, T) là cây khung của G. Nếu thêm một cạnh e ∈ET vào cây khung H ta sẽ thu được đúng 1 chu trình trong H, ký hiệu n là Ce. Tập các chu trình: Ω= { Ce: e ∈ET } được gọi là tập các chu trình cơ bản của đồ thị G. 13
Tính chất: u u u Tập các chu trình cơ bản phụ thuộc vào cây khung của đồ thị. Hai cây khung khác nhau có thể cho hai tập chu trình cơ sở khác nhau. Nếu một đồ thị liên thông có n đỉnh, m cạnh. Khi đó cây khung có n-1 cạnh, còn lại m-n+1 cạnh ngoài. Tương ứng với mỗi cạnh ngoài, ta có một chu trình cơ bản. Vì vậy, số chu trình cơ bản của một đồ thị liên thông là m-n+1. Tập các chu trình cơ bản là một tập nhiều nhất các chu trình thỏa mãn điều kiện: Mỗi chu trình có đúng một cạnh riêng, cạnh đó không nằm trong các chu trình còn lại và việc loại bỏ cạnh này không ảnh hưởng đến tính liên thông của đồ thị và không ảnh hưởng đến các chu trình còn lại. Như vậy ta có thể bỏ tối đa m - n+1 cạnh mà vẫn đảm bảo tính liên thông của đồ thị. 14
Tính chất u Giả sử A và B là hai tập hợp, ta đưa vào phép toán sau A B = (A B) (A B). u Tập A B được gọi là hiệu đối xứng của hai tập A và B. u Tên gọi chu trình cơ bản gắn liền với sự kiện chỉ ra trong định lý sau đây: u Định lý 3. Giả sử G=(V, E) là đồ thị vô hướng liên thông, H=(V, T) là cây khung của nó. Khi đó mọi chu trình của đồ thị G đều có thể biểu diễn như là hiệu đối xứng của một số các chu trình cơ bản. u 15
Ý nghĩa ứng dụng u Việc tìm tập các chu trình cơ bản giữ một vai trò quan trọng trong vấn đề giải tích mạng điện: l Theo mỗi chu trình cơ bản của đồ thị tương ứng với mạng điện cần phân tích ta sẽ thiết lập được một phương trình tuyến tính theo định luật Kirchoff: Tổng hiệu điện thế dọc theo một mạch vòng là bằng không. l Hệ thống phương trình tuyến tính thu được cho phép tính toán hiệu điện thế trên mọi đoạn đường dây của lưới điện. 16
Thuật toán xây dựng tập chu trình cơ bản u u u u Đầu vào: Đồ thị G=(V, E) được mô tả bằng danh sách kề Ke(v), v V. procedure Cycle(v); (* Tập các chu trình cơ bản của thành phần liên thông chứa đỉnh v. Các biến d, num, STACK, Index là toàn cục *) begin d: =d+1; STACK[d] : = v; num : = num+1; Index[v] : = num; for u Ke(v) do if Index[u]=0 then Cycle(u) else if (u STACK[d-1]) and (Index[v] > Index[u]) then < Ghi nhận chu trình với các đỉnh: STACK[d], STACK[d-1], . . . , STACK[c], với STACK[c]=u >; 17 d : = d-1; end;
Thuật toán xây dựng tập chu trình cơ bản (* Main Program *) BEGIN for v V do Index[v] : = 0; num : = 0; d : = 0; STACK[0] : = 0; for v V do if Index[v] = 0 then Cycle(v); END. u Độ phức tạp: O(|V|+|E|) 18
Tập các chu trình cơ bản: 20
Nội dung 4. 1. Cây và các tính chất cơ bản của cây 4. 2. Cây khung của đồ thị 4. 3. Xây dựng tập các chu trình cơ bản của đồ thị 4. 4. Xây dựng cây theo chiều sâu và chiều rộng 4. 5. Bài toán cây khung nhỏ nhất 21
Xây dựng cây khung u Xây dựng theo chiều sâu u Xây dựng theo chiều rộng u Tham số • Input: Đồ thị G lưu dưới dạng danh sách kềMảng Ke[] • Output: Cây khung T của đồthị u Mảng Chua. Xet[] dùng để đánh đấu các đỉnh đã được xét hay chưa. 22
Xây dựng theo chiều sâu /* Khai báo các biến toàn cục Chua. Xet, Ke, T */ void Tree_DFS(v); { Chua. Xet[v] = 0; for (u ∈Ke(v)) if (Chua. Xet[u]) { T = T ∪(v, u); Tree_DFS(u); }; } 23
Xây dựng theo chiều sâu main(){ /* Nhập đồ thị, tạo biến Ke */ for (v ∈V) Chua. Xet[v] = 1; /* Khởi tạo cờ cho đỉnh */ T = ∅; /* T là tập cạnh cây khung */ Tree_DFS(root); /* root là đỉnh nào đó của đồ thị */ } 24
Ví dụ: Xây dựng cây theo chiều sâu 25
Xây dựng cây theo chiều rộng /* Khai báo các biến toàn cục Chua. Xet, Ke, QUEUE */ void Tree_BFS(r); { QUEUE = ∅; QUEUE ⇐r; Chua. Xet[r] = 0; while (QUEUE != ∅){ v ⇐QUEUE; for (u ∈Ke(v)) if ( Chua. Xet[u] ){ QUEUE ⇐u; Chua. Xet[u] = 0; T = T ∪(v, u); }; } } 26
Xây dựng cây theo chiều rộng main() /* Nhập đồthị, tạo biến Ke */{ for (v ∈V) Chua. Xet[v] = 1; /* Khởi tạo cờ cho đỉnh */ T = ∅; /* T là tập cạnh cây khung */ Tree_BFS(root); /* root là đỉnh nào đó của đồ thị */ } 27
Ví dụ: Xây dựng cây theo chiều rộng 1 ->2 ->3 ->4 ->6 ->5 ->7 ->8 ->10 ->9 u Cây khung của G là: {(1, 2), (1, 3), (2, 4), (3, 5), (3, 6), (4, 7), (4, 8), (8, 9), (8, 10)} u 28
Nội dung 4. 1. Cây và các tính chất cơ bản của cây 4. 2. Cây khung của đồ thị 4. 3. Xây dựng tập các chu trình cơ bản của đồ thị 4. 4. Bài toán cây khung nhỏ nhất 29
BÀI TOÁN C Y KHUNG NHỎ NHẤT Minimum Spanning Tree (MST) 30
Bài toán CKNN Bài toán: Cho đồ thị vô hướng liên thông G=(V, E) với trọng số c(e), e E. Độ dài của cây khung là tổng trọng số trên các cạnh của nó. Cần tìm cây khung có độ dài nhỏ nhất. a 7 2 d 2 5 f 4 c 4 b 1 1 3 4 5 g 7 e Độ dài của cây khung là Tổng độ dài các cạnh: 14 31
Bài toán cây khung nhỏ nhất u Có thể phát biểu dưới dạng bài toán tối ưu tổ hợp: Tìm cực tiểu c(H) = c(e) min, e T với điều kiện H=(V, T) là cây khung của G. Do số lượng cây khung của G là rất lớn (xem định lý Cayley), nên không thể giải nhờ duyệt toàn bộ 32
Ứng dụng thực tế: Mạng truyền thông u Công ty truyền thông AT&T cần xây dựng mạng truyền thông kết nối n khách hàng. Chi phí thực hiện kênh nối i và j là cij. Hỏi chi phí nhỏ nhất để thực hiện việc kết nối tất cả các khách hàng là bao nhiêu? 3 5 1 4 10 8 7 6 2 9 Giả thiết là: Chỉ có cách kết nối duy nhất là đặt kênh nối trực tiếp giữa hai nút. 33
Bài toán xây dựng hệ thống đựờng sắt u u Giả sử ta muốn xây dựng một hệ thống đường sắt nối n thành phố sao cho hành khách có thể đi lại giữa hai thành phố bất kỳ đồng thời tổng chi phí xây dựng phải là nhỏ nhất. Rõ ràng là đồ thị mà đỉnh là các thành phố còn các cạnh là các tuyến đường sắt nối các thành phố tương ứng với phương án xây dựng tối ưu phải là cây. Vì vậy, bài toán đặt ra dẫn về bài toán tìm cây khung nhỏ nhất trên đồ thị đầy đủ n đỉnh, mỗi đỉnh tương ứng với một thành phố, với độ dài trên các cạnh chính là chi phí xây dựng đường ray nối hai thành phố tương ứng Chú ý: Trong bài toán này ta giả thiết là không được xây dựng tuyến đường sắt có các nhà ga phân tuyến nằm ngoài các thành phố. 34
Sơ đồ chung của các giải thuật Generic-MST(G, c) A={} //Bất biến: A là tập con các cạnh của CKNN nào đó while A chưa là cây khung do tìm cạnh (u, v) là an toàn đối với A A = A {(u, v)} // A vẫn là tập con các cạnh của CKNN nào đó return A Tìm cạnh an toàn bằng cách nào? Cạnh rẻ nhất để đảm bảo tính bất biến 35
Lát cắt gọi lát cắt (S, V S) là một cách phân hoạch tập đỉnh V ra thành hai tập S và V S. Ta nói cạnh e là cạnh vượt lát cắt (S, V S) nếu một đầu mút của nó là thuộc S còn đầu mút còn lại thuộc V S. u Ta u Giả sử A là một tập con các cạnh của đồ thị. Lát cắt (S, V S) được gọi là tương thích với A nếu như không có cạnh nào thuộc A là cạnh vượt lát cắt. 36
Lát cắt của G = (V, E) là phân hoạch V thành (S, V – S). Ví dụ. S = {a, b, c, f}, V – S = {e, d, g} 7 a d 2 2 5 f b 1 4 c 5 4 g 1 3 4 e 7 Các cạnh (b, d), (a, d), (b, e), (c, e) là cạnh vượt lát cắt. Các cạnh còn lại không vượt lát cắt. 37
Lát cắt tương thích với tập cạnh A 1 = { (a, b), (d, g), (f, b), (a, f) } A 2 = A 1 { (b, d) } Ví dụ. S = {a, b, c, f} 7 a 2 2 d 5 f 4 b 1 c 5 4 g 1 3 4 e 7 Lát cắt (S, V – S) là tương thích với A 1 không tương thích với A 2 (cạnh (b, d) vượt lát cắt). 38
Cạnh nhẹ là cạnh có trọng số nhỏ nhất trong số các cạnh vượt lát cắt. VD. S = {a, b, c, f} 7 a 2 d 2 5 f b c 4 3 cạnh nhẹ 1 4 4 5 e g 1 7 Cạnh (b, e) có trọng số 3, “nhẹ hơn” các cạnh vượt lát cắt còn lại (a, d), (b, d), và (c, e). 39
Cạnh nhẹ là cạnh an toàn! Định lý. Giả sử (S, V – S) là lát cắt của G=(V, E) tương thích với tập con A của E, và A là tập con của tập cạnh của CKNN của G. Gọi (u, v) là cạnh nhẹ vượt lát cắt (S, V – S). Khi đó (u, v) là an toàn đối với A; nghĩa là, A {(u, v)} cũng vẫn là tập con của tập cạnh của CKNN. 4 v 2 S 2 u V–S 6 A gồm các cạnh đỏ. 40
Tại sao cạnh nhẹ là an toàn? Chứng minh. Giả sử T là CKNN (gồm các cạnh đỏ) chứa A. Giả sử cạnh nhẹ (u, v) T. Ta có T { (u, v) } chứa chu trình. Tìm được cạnh (x, y) T vượt lát cắt (S, V – S). Cây khung T ' = T – { (x, y) } { (u, v) } có độ dài của cây khung T. Suy ra T ' cũng là CKNN. A { (u, v) } T ', tức là, (u, v) là an toàn đối với A. 4 S v 2 x 2 u 6 A y V–S 41
Hệ quả Giả sử A là tập con của E và cũng là tập con của tập cạnh của CKNN nào đó của G, và C là một thành phần liên thông trong rừng F = (V, A). Nếu (u, v) là cạnh nhẹ nối C với một thành phần liên thông khác trong F, thì (u, v) là an toàn đối với A. CM Cạnh (u, v) là cạnh nhẹ vượt lát cắt (C, V – C) tương thích với A. Theo định lý trên, cạnh (u, v) là an toàn đối với A. v 4 8 7 w u C A gồm 5 cạnh đỏ. 42
Tìm cạnh an toàn? Giả sử A là tập con của tập cạnh của một CKNN nào đó. Thuật toán Kruskal A là rừng. Cạnh an toàn được bổ sung vào A có trọng số nhỏ nhất trong số các cạnh nối các cặp thành phần liên thông của nó. Thuật toán Prim A là cây. Cạnh an toàn là cạnh nhẹ nối đỉnh trong A với một đỉnh không ở trong A. 43
Thuật toán Kruskal: u Thuật toán sẽ xây dựng tập cạnh ETcủa cây khung nhỏ nhất T=(VT, ET) theo từng bước. Trước hết sắp xếp các cạnh của đồ thị G theo thứ tự không giảm của trọng số. Bắt đầu từ ET=∅, ở mỗi bước ta sẽ lần lượt duyệt trong danh sách cạnh đã sắp xếp, từ cạnh có độ dài nhỏ đến cạnh có độ dài lớn hơn, để tìm ra cạnh mà việc bổ sung nó vào tập ET không tạo thành chu trình trong tập này. Thuật toán sẽ kết thúc khi ta thu được tập ET gồm n− 1 cạnh. 44
Cụ thể có thể mô tả như sau: 1. 2. 3. 4. Bắt đầu từ đồ thị rỗng T có n đỉnh. Sắp xếp các cạnh của G theo thứ tự không giảm của trọng số. Bắt đầu từ cạnh đầu tiên của dãy này, ta cứ thêm dần các cạnh của dãy đã được xếp vào T theo nguyên tắc cạnh thêm vào không được tạo thành chu trình trong T. Lặp lại Bước 3 cho đến khi nào số cạnh trong T bằng n− 1, ta thu được cây khung nhỏ nhất cần tìm. 45
Thuật toán Kruskal Generic-MST(G, c) A={} //Bất biến: A là tập con các cạnh của CKNN nào đó while A chưa là cây khung do tìm cạnh (u, v) là an toàn đối với A A = A {(u, v)} // A vẫn là tập con các cạnh của CKNN nào đó return A Thuật toán Kruskal A là rừng. Cạnh an toàn được bổ sung vào A có trọng số nhỏ nhất trong số các cạnh nối các cặp thành phần liên thông của nó. 46
Mô tả thuật toán Kruskal procedure Kruskal; begin sắp xếp các cạnh e 1, . . . , em theo thứ tự không giảm của độ dài; T = ; (* T – tập cạnh của CKNN *) for i = 1 to m do if T {ei} không chứa chu trình then T : = T {ei}; end 47
Ví dụ: u Tìm cây khung nhỏ nhất của đồ thị cho trong hình dưới đây: 48
Cách giải u Bắt đầu từ đồ thị rỗng T có 6 đỉnh. u Sắp xếp các cạnh của đồ thị theo thứ tự không giảm của trọng số: {(v 3, v 5), (v 4, v 6), (v 4, v 5), (v 5, v 6), (v 3, v 4), (v 1, v 3), (v 2, v 4), (v 1, v 2)}. u Thêm vào đồ thị T cạnh (v 3, v 5). u Do số cạnh của T là 1<6− 1 nên tiếp tục thêm cạnh (v 4, v 6) vào T. u Bây giờ số cạnh của T đã là 2 vẫn còn nhỏ hơn 6, ta tiếp tục thêm cạnh tiếp theo trong dãy đã sắp xếp vào T. 49
Cách giải u Sau khi thêm cạnh (v 4, v 5) vào T, nếu thêm cạnh (v 5, v 6) thì nó sẽ tạo thành với 2 cạnh (v 4, v 5), (v 4, v 6) đã có trong T một chu trình. u Tình huống tương tự cũng xãy ra đối với cạnh (v 3, v 4) là cạnh tiếp theo trong dãy. u Tiếp theo ta bổ sung cạnh (v 1, v 3), (v 2, v 3) vào T và thu dược tập ET gồm 5 cạnh: {(v 3, v 5), (v 4, v 6), (v 4, v 5), (v 1, v 3), (v 2, v 3)}. 50
Bài tập u Tìm cây khung nhỏ nhất của đồ thị cho trong hình dưới đây: 51
Bài tập u Tìm cây khung nhỏ nhất của đồ thị cho trong hình dưới đây: 7 a 2 d 2 5 f 4 b 4 g 1 3 1 c 5 4 e 7 52
Thời gian tính Bước 1. Sắp xếp dãy độ dài cạnh. O(m log n) Bước lặp: Xác định xem T { ei } có chứa chu trình hay không? Có thể sử dụng DFS để kiểm tra với thời gian O(n). Tổng cộng: O(m log n + mn) 53
Cách cài đặt hiệu quả Vấn đề đặt ra là: l Khi cạnh ei=(j, k) được xét, ta cần biết có phải j và k thuộc hai thành phần liên thông (tplt) khác nhau hay không. Nếu đúng, thì cạnh này được bổ sung vào cây khung và nó sẽ nối tplt chứa j và tplt chứa k. l Thực hiện điều này như thế nào cho đạt hiệu quả? 54
Cách cài đặt hiệu quả u Mỗi tplt C của rừng F được cất giữ như một tập. u Ký hiệu First(C) đỉnh đầu tiên trong tplt C. u Với mỗi đỉnh j trong tplt C, đặt First(j) = First(C) = đỉnh đầu tiên trong C. u Chú ý: Thêm cạnh (i, j) vào rừng F tạo thành chu trình iff i và j thuộc cùng một tplt, tức là First(i) = First(j). u Khi nối tplt C và D, sẽ nối tplt nhỏ hơn (ít đỉnh hơn) vào tplt lớn hơn (nhiều đỉnh hơn): Nếu |C| > |D|, thì First(C D) : = First(C). 55
Phân tích thời gian tính u Thời gian xác định First(i) = First(j) đối với i, j: O(1) cho mỗi cạnh. Tổng cộng là O(m). u Thời gian nối 2 tplt S và Q, giả thiết |S| |Q|. l O(1) với mỗi đỉnh của Q (là tplt nhỏ hơn) l Mỗi đỉnh i ở tplt nhỏ hơn nhiều nhất là log n lần. (Bởi vì, số đỉnh của tplt chứa i tăng lên gấp đôi sau mỗi lần nối. ) Tổng cộng thời gian nối là: O(n log n). u u Tổng thời gian thực hiện thuật toán là: O( m log n + n log n). 56
Thuật toán Prim u. A là cây (Bắt đầu từ cây chỉ có 1 đỉnh) u Cạnh an toàn là cạnh nhẹ nhất trong số các cạnh nối đỉnh trong A với một đỉnh không ở trong A. 57
Thuật toán Prim u Thuật toán Kruskal làm việc kém hiệu quả đối với những đồ thị dày (đồ thị có số cạnh m ≈n(n− 1)/2). Trong trường hợp đó, thuật toán Prim tỏ ra hiệu quả hơn. Thuật toán Prim còn được gọi là phương pháp lân cận gần nhất. 58
Mô tả thuật toán Prim procedure Prim(G, c) begin Chọn đỉnh tuỳ ý r V; Khởi tạo cây T=(V(T), E(T)) với V(T)={ r }và E(T)= ; while T có < n đỉnh do begin Gọi (u, v) là cạnh nhẹ nhất với u V(T) và v V(G) – V(T) E(T) { (u, v) }; V(T) { v } end; Tính đúng đắn suy từ hệ quả đã chứng minh: Giả sử A là tập con của E và cũng là tập con của tập cạnh của CKNN của G, và C là một thành phần liên thông trong rừng F = (V, A). Nếu (u, v) là cạnh nhẹ nối C với một tplt khác trong F, thì (u, v) là an toàn đối với A. 59
Thuật toán Prim – Ví dụ 7 a 2 d 2 5 f 4 b 4 chọn 4 g 1 3 1 c 5 e 7 các cạnh để chọn 60
7 a 2 d 2 5 f 4 b 4 g 1 3 1 c 5 4 e 7 61
7 a 2 d 2 5 f 4 b 4 g 1 3 1 c 5 4 e 7 62
7 a 2 d 2 5 f 4 b 4 g 1 3 1 c 5 4 e 7 63
7 a 2 d 2 5 f 4 b 4 g 1 3 1 c 5 4 e 7 64
Độ dài của CKNN: 14 7 a 2 d 2 5 f 4 b 4 g 1 3 1 c 5 4 e 7 65
Thuật toán Prim 1. VT: ={v*}, trong đó v*là đỉnh tuỳ ý của đồ thị G. ET: =∅. 2. Với mỗi đỉnh vj∉VT, tìm đỉnh wj∈VT sao cho m(wj, vj) = min m(xi, vj)=: βj xi∈VT và gán cho đỉnh vj nhãn [wj, βj]. Nếu không tìm đuợc wj như vậy (tức là khi vj không kề với bất cứ đỉnh nào trong VT) thì gán cho vj nhãn [0, ∞]. 3. Chọn đỉnh vj* sao cho βj*= min βj vj∉VT VT : = VT ∪{vj*}, ET : = ET ∪{(wj*, vj*)}. 66
Thuật toán Prim Ø Nếu |VT| = n thì thuật toán dừng và (VT, ET) là cây khung nhỏ nhất. Ø Nếu |VT| < n thì chuyển sang Bước 4. Đối với tất cả các đỉnh vj∉VT mà kề với vj*, ta thay đổi nhãn của chúng như sau: Nếu βj> m(vj*, vj) thì đặt βj: =m(vj*, vj) và nhãn của vj là [vj*, βj]. Ngược lại, ta giữ nguyên nhãn của vj. Sau đó quay lại Bước 3. 67
Ví dụ: u Tìm cây khung nhỏ nhất bằng thuật toán Prim của đồ thị gồm các đỉnh A, B, C, D, E, F, H, I được cho bởi ma trận trọng số sau. 68
69
Cài đặt thuật toán Prim đối với đồ thị dày u u u Giả sử đồ thị cho bởi ma trận trọng số C={c[i, j], i, j = 1, 2, . . . , n}. Ở mỗi bước để nhanh chóng chọn đỉnh và cạnh cần bổ sung vào cây khung, các đỉnh của đồ thị sẽ được gán cho các nhãn. Nhãn của một đỉnh v V-S có dạng [d[v], near[v]] : d[v] dùng để ghi nhận khoảng cách từ đỉnh v đến tập đỉnh S: d[v] : = min{ c[v, w] : w S } ( = c[v, z]), near[v] : = z ghi nhận đỉnh của cây khung gần v nhất 70
Thuật toán Prim procedure Prim; begin (* Bước khởi tạo *) S : = { r }; T : = ; d[r] : = 0; near[r] : = r. for v V S do begin d[v] : = c[r, v]; near[v] : = r; end; (* Bước lặp *) for k: =2 to n do begin Tìm u V S thoả mãn: d[u] = min { d[v] : v V S }; S : = S { u }; T : = T { ( u, near[u] ) } ; for v V S do if d[v] > c[u, v] then begin d[v] : = c[u, v] ; near[v] : = u; end; H = ( S , T ) là cây khung nhỏ nhất của đồ thị ; end; Thời gian tính: O(|V|2) 71
Thuật toán Prim – Ví dụ u Ví dụ: Tìm CKNN cho đồ thị cho bởi ma trận trọng số C = 1 2 3 4 5 6 1 0 33 17 2 33 0 18 20 3 17 18 0 16 4 4 20 16 0 9 8 5 4 9 0 14 6 8 14 0 72
Thuật toán Prim: Ví dụ Bước Đỉnh 1 Đỉnh 2 Đỉnh 3 Đỉnh 4 Đỉnh 5 Đỉnh 6 S Khởi tạo 1 2 3 4 5 73
Thuật toán Prim: Ví dụ Đỉnh 1 Khởi tạo [0, 1] Đỉnh 2 [33, 1] Đỉnh 3 [17, 1]* Đỉnh 4 [ , 1] Đỉnh 5 [ , 1] Đỉnh 6 [ , 1] S 1 1 2 3 4 5 74
Thuật toán Prim: Ví dụ Đỉnh 1 Khởi tạo 1 Đỉnh 2 Đỉnh 3 Đỉnh 4 Đỉnh 5 Đỉnh 6 S [0, 1] [33, 1] [17, 1]* [ , 1] 1 - [18, 3] - [16, 3] [4, 3]* [ , 1] 1, 3 2 3 4 5 for v V S do if d[v] > c[u, v] then d[v] : = c[u, v] ; near[v] : = u; 75
Thuật toán Prim: Ví dụ Đỉnh 1 Khởi tạo Đỉnh 2 Đỉnh 3 Đỉnh 4 Đỉnh 5 Đỉnh 6 S [0, 1] [33, 1] [17, 1]* [ , 1] 1 1 - [18, 3] - [16, 3] [4, 3]* [ , 1] 1, 3 2 - [18, 3] - [9, 5]* - [14, 5] 1, 3, 5 3 4 5 for v V S do if d[v] > c[u, v] then d[v] : = c[u, v] ; near[v] : = u; 76
Thuật toán Prim: Ví dụ Đỉnh 1 Khởi tạo Đỉnh 2 Đỉnh 3 Đỉnh 4 Đỉnh 5 Đỉnh 6 S [0, 1] [33, 1] [17, 1]* [ , 1] 1 1 - [18, 3] - [16, 3] [4, 3]* [ , 1] 1, 3 2 - [18, 3] - [9, 5]* - [14, 5] 1, 3, 5 3 - [18, 3] - - - [8, 4]* 1, 3, 5, 4 4 5 for v V S do if d[v] > c[u, v] then d[v] : = c[u, v] ; near[v] : = u; 77
Thuật toán Prim: Ví dụ Đỉnh 1 Khởi tạo Đỉnh 2 Đỉnh 3 Đỉnh 4 Đỉnh 5 Đỉnh 6 S [0, 1] [33, 1] [17, 1]* [ , 1] 1 1 - [18, 3] - [16, 3] [4, 3]* [ , 1] 1, 3 2 - [18, 3] - [9, 5]* - [14, 5] 1, 3, 5 3 - [18, 3] - - - [8, 4]* 1, 3, 5, 4 4 - [18, 3]* - - 1, 3, 5, 4, 6 5 for v V S do if d[v] > c[u, v] then d[v] : = c[u, v] ; near[v] : = u; 78
Thuật toán Prim: Ví dụ Đỉnh 1 Khởi tạo Đỉnh 2 Đỉnh 3 Đỉnh 4 Đỉnh 5 Đỉnh 6 S [0, 1] [33, 1] [17, 1]* [ , 1] 1 1 - [18, 3] - [16, 3] [4, 3]* [ , 1] 1, 3 2 - [18, 3] - [9, 5]* - [14, 5] 1, 3, 5 3 - [18, 3] - - - [8, 4]* 1, 3, 5, 4 4 - [18, 3]* - - 1, 3, 5, 4, 6 5 - - - 1, 3, 5, 4, 6, 2 Độ dài của CKNN : 18 + 17 + 9 + 4 + 8 = 56 Tập cạnh của CKNN: {(2, 3), (3, 1), (4, 5), (5, 3), (6, 4)} 79
Bài tập Tìm cây khung nhỏ nhất của đồ thị sau theo thuật toán Kruskal và Prim. 80
CHƯƠNG V C Y
Giới thiệu u u Một đồ thị liên thông và không có chu trình được gọi là cây. Dùng cây để xây dựng các thuật toán rất có hiệu quả để định vị các phần tử trong một danh sách Cây cũng dùng để xây dựng các mạng máy tính với chi phí rẻ nhất cho các đường điện thoại nối các máy phân tán Cây cũng được dùng để tạo ra các mã có hiệu quả để lưu trữ và truyền dữ liệu Dùng cây có thể mô hình các thủ tục mà để thi hành nó cần dùng một dãy các quyết định
ĐỊNH NGHĨA VÀ CÁC TÍNH CHẤT CƠ BẢN u Định nghĩa: Cây là một đồ thị vô hướng liên thông, không chứa chu trình và có ít nhất hai đỉnh. u Một đồ thị vô hướng không chứa chu trình và có ít nhất hai đỉnh gọi là một rừng. u Trong một rừng, mỗi thành phần liên thông là một cây.
Ví dụ: u Rừng sau có 3 cây
Ví dụ: u Cây sau có nút gốc là r
Các khái niệm: u T là một cây có gốc u x, y, z là các đỉnhtrong T u V 0, v 1, …, vnlà một đường đi đơn trong. T u Vn-1 là cha của vn u v 0, v 1, …, vn-1 là các tiền bối của vn u Vn là con của vn-1 u Nếu x là tiền bối của y thì y là hậu duệ của x u Nếu y, z là con của x thì y và z là anh em 88
Các khái niệm: u Nếu x không có con thì x là lá (leaf) u Nếu x không là lá thì x là đỉnh trong u Mức(level) của đỉnh x là chiều dài (số cành) của đường đơn từ gốc v 0 tới x. level(v 0) = 0 u Chiều cao(height) của một cây là mức lớn nhất trong cây u Cây con(subtree) của T gốc tại x là đồ thị con của T mà: l l Tập đỉnh gồm x và tất cả các hậu duệ của x Tập các cành gồm mọi cành nối tới các hậu duệ của x 89
Ví dụ: u u u u u Cha của c là b Con của g là h, i, j Các tiền bối của e là c, b, a Các hậu duệ của b là c, d, e Các đỉnh trong: a, b, c, g, h, j, k Các lá : d, e, f, l, m, i, n, o Mức của c là 2, của k là 3 Chiều cao của cây là 4 Cây con gốc g. 90
Các khái niệm: u Một cây có gốc gọi là: u m – cây(m-ary tree) nếu mỗi đỉnh trong không có quá m con u m – cây đầy(full m-ary tree) nếu mỗi đỉnh trong có đúng m con u Cây nhị phân(binary tree) nếu mỗi đỉnh không có quá 2 con u Cây có gốc thứ tự(Ordered rooted tree) nếu các con của mỗi đỉnh trong được xếp thứ tự từ trái qua phải 91
Các khái niệm: u Đặc biệt: Cây nhị phân có thứ tự: u Nếu một đỉnh trong có đủ 2 con thì u l Con thứ nhất là con bên trái( left child) l Con thứ 2 là con bên phải ( right child) Một m – cây với chiều cao h gọi là thăng bằng nếu tất cả các lá đều ở mức h hay h-1. 92
Ví dụ: u u Mô hình gia phả một dòng họ Mô hình biểu diễn của các tổ chức l Mô hình tổ chức Trường Đại Học 93
Ví dụ: u Mô hình các tập tin trong máy tính l Các tập tin trong máy tính được tổ chức thành các thư mục, các thư mục được tổ chức dưới dạng cây, trong đó thư mục gốc là gốc của cây. 94
Cây tìm kiếm nhị phân: u Một cây tìm kiếm nhị phân là một cây nhị phân T mà trong đó: l Mỗi đỉnh được gán cho một nhãn l Các nhãn có thểso sánh được với nhau ∀ đỉnh v∈T, các nhãn trong cây con bên trái của v đều nhỏ hơn nhãn của v và các nhãn trong cây con bên phải của v đều lớn hơn nhãn của v 95
Ví dụ: u Cho dãy số: 30, 20, 10, 40, 32, 27, 17, 8, 42, 78, 35. Biểu diễn dãy số dưới dạng cây nhị phân tìm kiếm. 96
Cây quyết định: u Cây quyết địnhlà cây có gốc mà: l Mỗi đỉnh tương ứng với 1 quyết định l Mỗi cây con tại các đỉnh này ứng với mỗi kết cục có thể của quyết định l Một lời giải là một đường đi từ gốc đến lá 97
Ví dụ: Cho 8 đồng xu, trong đó có một đồng nhẹ hơn. Xác định nó bằng 1 cái cân thăng bằng. Giải: u Có 3 trạng thái sau mỗi lần cân. Do đó cây quyết định cho một dãy các lần cân làcây tam phân. �Có ít nhất 8 lá trong cây quyết định vì có 8 kết cục có thể và mỗi kết cục cần biểu diễn bằng ít nhất 1 lá u Số lần cân nhiều nhất để xác định đồng xu giả là chiều cao của cây h. u Ta có h ≥�log 38�= 2 (làm tròn tăng) u 98
Cây quyết định: 99
Một số mệnh đề: u Mệnh đề: Một cây m-phân đầy đủ có i đỉnh trong thì có m*i+1 đỉnh và có (m− 1)i+1 lá. u Mệnh đề: u 1) Một cây m-phân có chiều cao h thì có nhiều nhất là mh lá. u 2) Một cây m-phân có l lá thì có chiều cao h ≥ [logml].
Các phương pháp duyệt cây u Thuật toán viếng thăm mọi đỉnh của một cây có gốc có thứ tự đúng 1 lần một cách có hệ thống gọi là thuật toán duyệt cây u �Có 3 thuật toán phổthông: l �Duyệt tiền tự (Preoder traversal) l �Duyệt trung tự(Inorder traversal) l �Duyệt hậu tự (Postorder traversal) 101
Thuật toán tiền thứ tự: l 1. Thăm gốc r. l 2. Duyệt cây con bên trái của T(r) theo tiền thứ tự. l 3. Duyệt cây con bên phải của T(r) theo tiền thứ tự.
Thuật toán trung thứ tự: l 1. Duyệt cây con bên trái của T(r) theo trung thứ tự. l 2. Thăm gốc r. l 3. Duyệt cây con bên phải của T(r) theo trung thứ tự.
Thuật toán hậu thứ tự: l 1. Duyệt cây con bên trái của T(r) theo hậu thứ tự. l 2. Duyệt cây con bên phải của T(r) theo hậu thứ tự. l 3. Thăm gốc r.
Ví dụ: Duyệt cây theo 3 phương pháp trên 105
Ký pháp Ba Lan: u Xét biểu thức đại số sau đây: u Vẽ cây: mỗi đỉnh trong mang dấu của một phép tính, gốc của cây mang phép tính sau cùng trong, ở đây là dấu nhân ( ký hiệu là ∗), mỗi lá mang một số hoặc một chữ đại diện cho số. (Cây thể hiện đã bỏ dấu ngoặc)
Ký pháp Ba Lan: Duyệt cây nhị phân trong hình trên theo trung thứ tự là: a + b ∗c −d / 2 (2) Ta biết rằng các dấu ngoặc trong (1) là rất cần thiết, vì (2) có thể hiểu theo nhiều cách khác (1), chẳng hạn là : (a + b ∗c) −d / 2 (3) hoặc là a + (b ∗c −d) / 2 (4) u 107
Ký pháp Ba Lan: u Các biểu thức (3) có thể biểu diễn bằng cây nhị phân trong các hình sau: 108
Ký pháp Ba Lan: u Các biểu thức (4) có thể biểu diễn bằng cây nhị phân trong các hình sau: u Nhưng cả hai đều có kết quả giống nhau khi duyệt theo trung thứ tự. 109
Ký pháp Ba Lan: Đối với cây trong hình thứ nhất, nếu duyệt theo tiền thứ tự, ta có ∗+ a b −c / d 2 (5) và nếu duyệt theo hậu thứ tự, ta có: ab+cd 2/−∗ (6) u Đối với cây thứ 2 nếu duyệt theo tiền thứ tự và hậu thứ tự thì sẽ cho kết quả khác. Nên duyệt cây theo tiền thứ thự và hậu thứ tự sẽ xác định được một cây duy nhất mà không sợ bị hiểu nhầm khi không có dấu ngoặc. u 110
Ký pháp Ba Lan: u Người ta gọi cách viết biểu thức theo tiền thứ tự là ký pháp Ba Lan, còn cách viết theo hậu thứ tự là ký pháp Ba Lan đảo, để ghi nhớ đóng góp của nhà toán học và lôgic học Ba Lan Lukasiewicz (1878 -1956) trong vấn đề này. 111
chuyển biểu thức thành cây u Chuyển một biểu thức viết theo ký pháp quen thuộc (có dấu ngoặc) sang dạng ký pháp Ba Lan hay ký pháp Ba Lan đảo hoặc ngược lại, có thể thực hiện bằng cách vẽ cây nhị phân tương ứng. Nhưng thay vì vẽ cây nhị phân, ta có thể xem xét để xác định dần các công thức bộ phận của công thức đã cho:
Ví dụ: u Chuyển biểu thức theo ký pháp Ba Lan sau thành biểu thức dưới dạng quen thuộc: −∗↑/−−ab∗ 5 c 23↑−cd 2∗−−acd/↑−b∗ 3 d 35 u Ta phân tích dần các công thức bộ phận như sau: 113
114
Bài tập: u 1) Duyệt các cây sau đây lần lượt bằng các thuật toán tiền thứ tự, trung thứ tự và hậu thứ tự.
Bài tập: u 2) Duyệt các cây sau đây lần lượt bằng các thuật toán tiền thứ tự, trung thứ tự và hậu thứ tự.
Bài tập: u Viết các biểu thức sau đây theo ký pháp Ba Lan và ký pháp Ba Lan đảo. u Viết các biểu thức sau đây theo ký pháp quen thuộc.
- Slides: 117