1. Trang chủ
  2. » Khoa Học Tự Nhiên

[Giáo trình Toán rời rạc] - Chương6 - Tree doc

17 333 3

Đ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

Thông tin cơ bản

Định dạng
Số trang 17
Dung lượng 220,56 KB

Nội dung

http://ebook.here.vn Tải miễn phí ðề thi, eBook, Tài liệu học tập 87 CHƯƠNG VI CÂY Một ñồ thị liên thông và không có chu trình ñược gọi là cây. Cây ñã ñược dùng từ năm 1857, khi nhà toán học Anh tên là Arthur Cayley dùng cây ñể xác ñịnh những dạng khác nhau của hợp chất hoá học. Từ ñó cây ñã ñược dùng ñể giải nhiều bài toán trong nhiều lĩnh vực khác nhau. Cây rất hay ñược sử dụng trong tin học. Chẳng hạn, người ta 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. Vì vậy cây ñặc biệt có giá trị khi nghiên cứu các thuật toán sắp xếp. 6.1. ðỊNH NGHĨA VÀ CÁC TÍNH CHẤT CƠ BẢN. 6.1.1. ðị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. 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. Trong một rừng, mỗi thành phần liên thông là một cây. Thí dụ 1: Rừng sau có 3 cây: 6.1.2. Mệnh ñề: Nếu T là một cây có n ñỉnh thì T có ít nhất hai ñỉnh treo. Chứng minh: Lấy một cạnh (a,b) tuỳ ý của cây T. Trong tập hợp các ñường ñi sơ cấp chứa cạnh (a,b), ta lấy ñường ñi từ u ñến v dài nhất. Vì T là một cây nên u ≠ v. Mặt khác, u và v phải là hai ñỉnh treo, vì nếu một ñỉnh, u chẳng hạn, không phải là ñỉnh treo thì u phải là ñầu mút của một cạnh (u,x), với x là ñỉnh không thuộc ñường ñi từ u ñến v. Do ñó, ñường ñi sơ cấp từ x ñến v, chứa cạnh (a,b), dài hơn ñường ñi từ u ñến v, trái với tính chất ñường ñi từ u ñến v ñã chọn. 6.1.3. ðịnh lý: Cho T là một ñồ thị có n ≥ 2 ñỉnh. Các ñiều sau là tương ñương: 1) T là một cây. 2) T liên thông và có n−1 cạnh. 3) T không chứa chu trình và có n−1 cạnh. 4) T liên thông và mỗi cạnh là cầu. 5) Giữa hai ñỉnh phân biệt bất kỳ của T luôn có duy nhất một ñường ñi sơ cấp. a b c f d e g h j i k l m n http://ebook.here.vn Tải miễn phí ðề thi, eBook, Tài liệu học tập 88 6) T không chứa chu trình nhưng khi thêm một cạnh mới thì có ñược một chu trình duy nhất. Chứng minh: 1)⇒ ⇒⇒ ⇒2) Chỉ cần chứng minh rằng một cây có n ñỉnh thì có n−1 cạnh. Ta chứng minh bằng quy nạp. ðiều này hiển nhiên khi n=2. Giả sử cây có k ñỉnh thì có k−1 cạnh, ta chứng minh rằng cây T có k+1 ñỉnh thì có k cạnh. Thật vậy, trong T nếu ta xoá một ñỉnh treo và cạnh treo tương ứng thì ñồ thị nhận ñược là một cây k ñỉnh, cây này có k−1 cạnh, theo giả thiết quy nạp. Vậy cây T có k cạnh. 2)⇒ ⇒⇒ ⇒3) Nếu T có chu trình thì bỏ ñi một cạnh trong chu trình này thì T vẫn liên thông. Làm lại như thế cho ñến khi trong T không còn chu trình nào mà vẫn liên thông, lúc ñó ta ñược một cây có n ñỉnh nhưng có ít hơn n−1 cạnh, trái với 2). 3)⇒ ⇒⇒ ⇒4) Nếu T có k thành phần liên thông T 1 , , T k lần lượt có số ñỉnh là n 1 , , n k (với n 1 +n 2 + … +n k =n) thì mỗi T i là một cây nên nó có số cạnh là n i −1. Vậy ta có n−1=(n 1 −1)+(n 2 −1)+ +(n k −1)=(n 1 +n 2 + … +n k )−k=n−k. Do ñó k=1 hay T liên thông. Hơn nữa, khi bỏ ñi một cạnh thì T hết liên thông, vì nếu còn liên thông thì T là một cây n ñỉnh với n−2 cạnh, trái với ñiều ñã chứng minh ở trên. 4)⇒ ⇒⇒ ⇒5) Vì T liên thông nên giữa hai ñỉnh phân biệt bất kỳ của T luôn có một ñường ñi sơ cấp, nhưng không thể ñược nối bởi hai ñường ñi sơ cấp vì nếu thế, hai ñường ñó sẽ tạo ra một chu trình và khi bỏ một cạnh thuộc chu trình này, T vẫn liên thông, trái với giả thiết. 5)⇒ ⇒⇒ ⇒6) Nếu T chứa một chu trình thì hai ñỉnh bất kỳ trên chu trình này sẽ ñược nối bởi hai ñường ñi sơ cấp. Ngoài ra, khi thêm một cạnh mới (u,v), cạnh này sẽ tạo nên với ñường ñi sơ cấp duy nhất nối u và v một chu trình duy nhất. 6)⇒ ⇒⇒ ⇒1) Nếu T không liên thông thì thêm một cạnh nối hai ñỉnh ở hai thành phần liên thông khác nhau ta không nhận ñược một chu trình nào. Vậy T liên thông, do ñó nó là một cây. 6.2. CÂY KHUNG VÀ BÀI TOÁN TÌM CÂY KHUNG NHỎ NHẤT. 6.2.1. ðịnh nghĩa: Trong ñồ thị liên thông G, nếu ta loại bỏ cạnh nằm trên chu trình nào ñó thì ta sẽ ñược ñồ thị vẫn là liên thông. Nếu cứ loại bỏ các cạnh ở các chu trình khác cho ñến khi nào ñồ thị không còn chu trình (vẫn liên thông) thì ta thu ñược một cây nối các ñỉnh của G. Cây ñó gọi là cây khung hay cây bao trùm của ñồ thị G. Tổng quát, nếu G là ñồ thị có n ñỉnh, m cạnh và k thành phần liên thông thì áp dụng thủ tục vừa mô tả ñối với mỗi thành phần liên thông của G, ta thu ñược ñồ thị gọi là rừng khung của G. Số cạnh bị loại bỏ trong thủ tục này bằng m−n+k, số này ký hiệu là ν(G) và gọi là chu số của ñồ thị G. 6.2.2. Bài toán tìm cây khung nhỏ nhất: Bài toán tìm cây khung nhỏ nhất của ñồ thị là một trong số những bài toán tối ưu trên ñồ thị tìm ñược ứng dụng trong nhiều lĩnh http://ebook.here.vn Tải miễn phí ðề thi, eBook, Tài liệu học tập 89 vực khác nhau của ñời sống. Trong phần này ta sẽ có hai thuật toán cơ bản ñể giải bài toán này. Trước hết, nội dung của bài toán ñược phát biểu như sau. Cho G=(V,E) là ñồ thị vô hướng liên thông có trọng số, mỗi cạnh e∈E có trọng số m(e)≥0. Giả sử T=(V T ,E T ) là cây khung của ñồ thị G (V T =V). Ta gọi ñộ dài m(T) của cây khung T là tổng trọng số của các cạnh của nó: m(T)= ∑ ∈ T E )( e em . Bài toán ñặt ra là trong số tất cả các cây khung của ñồ thị G, hãy tìm cây khung có ñộ dài nhỏ nhất. Cây khung như vậy ñược gọi là cây khung nhỏ nhất của ñồ thị và bài toán ñặt ra ñược gọi là bài toán tìm cây khung nhỏ nhất. ðể minh hoạ cho những ứng dụng của bài toán cây khung nhỏ nhất, dưới ñây là hai mô hình thực tế tiêu biểu cho nó. Bài toán xây dựng hệ thống ñường sắt: 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 từ bất cứ một thành phố nào ñến bất kỳ một trong số các thành phố còn lại. Mặt khác, trên quan ñiểm kinh tế ñòi hỏi là chi phí về xây dựng hệ thống ñườ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 hệ thống ñường sắt nối hai thành phố. Bài toán nối mạng máy tính: Cần nối mạng một hệ thống gồm n máy tính ñánh số từ 1 ñến n. Biết chi phí nối máy i với máy j là m(i,j) (thông thường chi phí này phụ thuộc vào ñộ dài cáp nối cần sử dụng). Hãy tìm cách nối mạng sao cho tổng chi phí là nhỏ nhất. Bài toán này cũng dẫn về bài toán tìm cây khung nhỏ nhất. Bài toán tìm cây khung nhỏ nhất ñã có những thuật toán rất hiệu quả ñể giải chúng. Ta sẽ xét hai trong số những thuật toán như vậy: thuật toán Kruskal và thuật toán Prim. 6.2.3. Thuật toán Kruskal: Thuật toán sẽ xây dựng tập cạnh E T của cây khung nhỏ nhất T=(V T , E T ) 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ừ E T =∅, ở 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 E T 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 E T gồm n−1 cạnh. Cụ thể có thể mô tả như sau: 1. Bắt ñầu từ ñồ thị rỗng T có n ñỉnh. 2. Sắp xếp các cạnh của G theo thứ tự không giảm của trọng số. 3. 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. http://ebook.here.vn Tải miễn phí ðề thi, eBook, Tài liệu học tập 90 4. 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. Thí dụ 2: Tìm cây khung nhỏ nhất của ñồ thị cho trong hình dưới ñây: Bắt ñầu từ ñồ thị rỗng T có 6 ñỉnh. 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 3 ), (v 2 , v 4 ), (v 1 , v 2 )}. Thêm vào ñồ thị T cạnh (v 3 , v 5 ). 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. 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. 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. 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. 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 E T 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 )}. Tính ñúng ñắn của thuật toán: Rõ ràng ñồ thị thu ñược theo thuật toán có n−1 cạnh và không có chu trình. Vì vậy theo ðịnh lý 6.1.3, nó là cây khung của ñồ thị G. Như vậy chỉ còn phải chỉ ra rằng T có ñộ dài nhỏ nhất. Giả sử tồn tại cây khung S của ñồ thị mà m(S)<m(T). Ký hiệu e k là cạnh ñầu tiên trong dãy các cạnh của T xây dựng theo thuật toán vừa mô tả không thuộc S. Khi ñó ñồ thị con của G sinh bởi cây S ñược bổ sung cạnh e k sẽ chứa một chu trình duy nhất C ñi qua e k . Do chu trình C phải chứa cạnh e thuộc S nhưng không thuộc T nên ñồ thị con thu ñược từ S bằng cách thay cạnh e của nó bởi e k , ký hiệu ñồ thị này là S’, sẽ là cây khung. Theo cách xây dựng, m(e k )≤m(e), do ñó m(S’)≤m(S), ñồng thời số cạnh chung của S’ và T ñã tăng thêm một so với số cạnh chung của S và T. Lặp lại quá trình trên từng bước một, ta có thể biến ñổi S thành T và trong mỗi bước tổng ñộ dài không tăng, tức là m(T)≤m(S). Mâu thuẩn này chứng tỏ T là cây khung nhỏ nhất của G. ðộ phức tạp của thuật toán Kruskal ñược ñánh giá như sau. Trước tiên, ta sắp xếp các cạnh của G theo thứ tự có chiều dài tăng dần; việc sắp xếp này có ñộ phức tạp O(p 2 ), với p là số cạnh của G. Người ta chứng minh ñược rằng việc chọn e i+1 không tạo nên chu trình với i cạnh ñã chọn trước ñó có ñộ phức tạp là O(n 2 ). Do p≤n(n−1)/2, thuật toán Kruskal có ñộ phức tạp là O(p 2 ). v 2 v 3 v 1 v 4 v 5 v 6 v 1 v 2 v 3 v 4 v 5 v 6 33 17 18 16 4 9 8 14 20 http://ebook.here.vn Tải miễn phí ðề thi, eBook, Tài liệu học tập 91 6.2.4. Thuật toán Prim: 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. 1. V T :={v * }, trong ñó v * là ñỉnh tuỳ ý của ñồ thị G. E T :=∅. 2. Với mỗi ñỉnh v j ∉V T , tìm ñỉnh w j ∈V T sao cho m(w j ,v j ) = min m(x i , v j )=:β j x i ∈V T và gán cho ñỉnh v j nhãn [w j , β j ]. Nếu không tìm ñuợc w j như vậy (tức là khi v j không kề với bất cứ ñỉnh nào trong V T ) thì gán cho v j nhãn [0, ∞]. 3. Chọn ñỉnh v j* sao cho β j* = min β j v j ∉V T V T := V T ∪ {v j* }, E T := E T ∪ {(w j* , v j* )}. Nếu |V T | = n thì thuật toán dừng và (V T , E T ) là cây khung nhỏ nhất. Nếu |V T | < n thì chuyển sang Bước 4. 4. ðối với tất cả các ñỉnh v j ∉V T mà kề với v j* , ta thay ñổi nhãn của chúng như sau: Nếu β j > m(v j* , v j ) thì ñặt β j :=m(v j* , v j ) và nhãn của v j là [v j* , β j ]. Ngược lại, ta giữ nguyên nhãn của v j . Sau ñó quay lại Bước 3. Thí dụ 3: 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.                           ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ 14182111191218 14172321202032 18173430211920 21233422293423 11213022131319 19202129133316 12201934133315 18322023191615 . Yêu cầu viết các kết quả trung gian trong từng bước lặp, kết quả cuối cùng cần ñưa ra tập cạnh và ñộ dài của cây khung nhỏ nhất. A B C D E F H A I B C D E F H I http://ebook.here.vn Tải miễn phí ðề thi, eBook, Tài liệu học tập 92 V.lặp A B C D E F H I V T E T K.tạo − [A,15] [A,16] [A,19] [A,23] [A,20] [A,32] [A,18] A ∅ 1 − − [A,16] [B,13] [A,23] [B,19] [B,20] [B,12] A, B (A,B) 2 − − [A,16] [I,11] [I,21] [I,18] [I,14] − A, B, I (A,B), (B,I) 3 − − [D,13] − [I,21] [I,18] [I,14] − A, B, I, D (A,B), (B,I), (I,D) 4 − − − − [I,21] [I,18] [I,14] − A, B, I, D, C (A,B), (B,I), (I,D), (D,C) 5 − − − − [I,21] [H,17] − − A, B, I, D, C, H (A,B), (B,I), (I,D), (D,C), (I,H) 6 − − − − [I,21] − − − A, B, I, D, C, H, F (A,B), (B,I), (I,D), (D,C), (I,H), (H,F) 7 − − − − − − − − A, B, I, D, C, H, F, E (A,B), (B,I), (I,D), (D,C), (I,H), (H,F), (I,E) Vậy ñộ dài cây khung nhỏ nhất là: 15 + 12 + 11 + 13 + 14 + 17 + 21 = 103. Tính ñúng ñắn của thuật toán: ðể chứng minh thuật toán Prim là ñúng, ta chứng minh bằng quy nạp rằng T(k) (k=1, 2, ,n), ñồ thị nhận ñược trong vòng lặp thứ k, là một ñồ thị con của cây khung nhỏ nhất của G, do ñó T(n) chính là một cây khung nhỏ nhất của G. T(1) chỉ gồm ñỉnh v * của G, do ñó T(1) là ñồ thị con của mọi cây khung của G. Giả sử T(i) (1≤i<n) là một ñồ thị con của một cây khung nhỏ nhất của G. Ta chứng minh rằng T(i+1) cũng là ñồ thị con của một cây khung nhỏ nhất. Thật vậy, theo thuật toán Prim E T(i+1) =E T(i) ∪ {e i+1 }, với e i+1 là cạnh ngắn nhất trong tất cả các cạnh có một ñầu mút thuộc V T(i) , ñầu mút kia không thuộc V T(i) . Nếu e i+1 là một cạnh của T thì T i+1 là ñồ thị con của T. Nếu e i+1 không phải là một cạnh của T thì T i+1 là ñồ thị con T’=(V T , E T ∪{e i+1 }). ðồ thị T’ chứa một chu trình sơ cấp duy nhất C (theo tính chất 6 của ñịnh lý về cây). Ta chọn trong C một cạnh e j có một ñỉnh thuộc T(i) và ñỉnh kia không thuộc T(i) và e j ≠e i+1 . Ta bỏ e j trong C. Khi ñó T’’=(V T , E T’ \ {e j }) là một cây khung của G và T(i+1) là ñồ thị con của T’ nên cũng là ñồ thị con của T’’. Theo cách chọn e i+1 của thuật toán Prim, ta có m(e i+1 ) ≤ m(e j ) do ñó m(T’’) ≤ m(T). Nhưng T’’ là một cây khung của G, còn T là cây khung nhỏ nhất, vì vậy phải có m(T’’)=m(T), tức là T’’ cũng là cây khung nhỏ nhất của G. ðộ phức tạp của thuật toán Prim là O(n 3 ). Thật vậy, nếu T(k) có k ñỉnh thì có n−k ñỉnh không thuộc T(k), do ñó ta phải chọn chiều dài nhỏ nhất của nhiều nhất là k(n−k) cạnh. Do k(n−k) < (n−1) 2 , nên ñộ phức tạp của bước chọn e k+1 là O(n 2 ). Vì phải chọn n−1 cạnh, nên ñộ phức tạp của thuật toán Prim là O(n 3 ). http://ebook.here.vn Tải miễn phí ðề thi, eBook, Tài liệu học tập 93 6.3. CÂY CÓ GỐC. 6.3.1. ðịnh nghĩa: Cây có hướng là ñồ thị có hướng mà ñồ thị vô hướng nền của nó là một cây. Cây có gốc là một cây có hướng, trong ñó có một ñỉnh ñặc biệt, gọi là gốc, từ gốc có ñường ñi ñến mọi ñỉnh khác của cây. Thí dụ 4: Trong cây có gốc thì gốc r có bậc vào bằng 0, còn tất cả các ñỉnh khác ñều có bậc vào bằng 1. Một cây có gốc thường ñược vẽ với gốc r ở trên cùng và cây phát triển từ trên xuống, gốc r gọi là ñỉnh mức 0. Các ñỉnh kề với r ñược xếp ở phía dưới và gọi là ñỉnh mức 1. ðỉnh ngay dưới ñỉnh mức 1 là ñỉnh mức 2, Tổng quát, trong một cây có gốc thì v là ñỉnh mức k khi và chỉ khi ñường ñi từ r ñến v có ñộ dài bằng k. Mức lớn nhất của một ñỉnh bất kỳ trong cây gọi là chiều cao của cây. Cây có gốc ở hình trên thường ñược vẽ như trong hình dưới ñây ñể làm rõ mức của các ñỉnh. r a b c e g d i h l m j f k n o p q r a b c d e g f h i j k l m n p o q http://ebook.here.vn Tải miễn phí ðề thi, eBook, Tài liệu học tập 94 Trong cây có gốc, mọi cung ñều có hướng từ trên xuống, vì vậy vẽ mũi tên ñể chỉ hướng ñi là không cần thiết; do ñó, người ta thường vẽ các cây có gốc như là cây nền của nó. 6.3.2. ðịnh nghĩa: Cho cây T có gốc r=v 0 . Giả sử v 0 , v 1 , , v n-1 , v n là một ñường ñi trong T. Ta gọi: − v i+1 là con của v i và v i là cha của v i+1 . − v 0 , v 1 , , v n-1 là các tổ tiên của v n và v n là dòng dõi của v 0 , v 1 , , v n-1 . − ðỉnh treo v n là ñỉnh không có con; ñỉnh treo cũng gọi là lá hay ñỉnh ngoài; một ñỉnh không phải lá là một ñỉnh trong. 6.3.3. ðịnh nghĩa: Một cây có gốc T ñược gọi là cây m-phân nếu mỗi ñỉnh của T có nhiều nhất là m con. Với m=2, ta có một cây nhị phân. Trong một cây nhị phân, mỗi con ñược chỉ rõ là con bên trái hay con bên phải; con bên trái (t.ư. phải) ñược vẽ phía dưới và bên trái (t.ư. phải) của cha. Cây có gốc T ñược gọi là một cây m-phân ñầy ñủ nếu mỗi ñỉnh trong của T ñều có m con. 6.3.4. Mệnh ñề: Một cây m-phân ñầy ñủ có i ñỉnh trong thì có mi+1 ñỉnh và có (m−1)i+1 lá. Chứng minh: Mọi ñỉnh trong của cây m-phân ñầy ñủ ñều có bậc ra là m, còn lá có bậc ra là 0, vậy số cung của cây này là mi và do ñó số ñỉnh của cây là mi+1. Gọi l là số lá thì ta có l+i=mi+1, nên l=(m−1)i+1. 6.3.5. Mệnh ñề: 1) Một cây m-phân có chiều cao h thì có nhiều nhất là m h lá. 2) Một cây m-phân có l lá thì có chiều cao h ≥ [log m l]. Chứng minh: 1) Mệnh ñề ñược chứng minh bằng quy nạp theo h. Mệnh ñề hiển nhiên ñúng khi h=1. Giả sử mọi cây có chiều cao k ≤ h−1 ñều có nhiều nhất m k-1 lá (với h≥2). Xét cây T có chiều cao h. Bỏ gốc khỏi cây ta ñược một rừng gồm không quá m cây con, mỗi cây con này có chiều cao ≤ h−1. Do giả thiết quy nạp, mỗi cây con này có nhiều nhất là m h-1 lá. Do lá của những cây con này cũng là lá của T, nên T có nhiều nhất là m.m h-1 =m h lá. 2) l ≤ m h ⇔ h ≥ [log m l]. 6.4. DUYỆT CÂY NHỊ PHÂN. 6.4.1. ðịnh nghĩa: Trong nhiều trường hợp, ta cần phải “ñiểm danh” hay “thăm” một cách có hệ thống mọi ñỉnh của một cây nhị phân, mỗi ñỉnh chỉ một lần. Ta gọi ñó là việc duyệt cây nhị phân hay ñọc cây nhị phân. Có nhiều thuật toán duyệt cây nhị phân, các thuật toán ñó khác nhau chủ yếu ở thứ tự thăm các ñỉnh. Cây nhị phân T có gốc r ñược ký hiệu là T(r). Giả sử r có con bên trái là u, con bên phải là v. Cây có gốc u và các ñỉnh khác là mọi dòng dõi của u trong T gọi là cây http://ebook.here.vn Tải miễn phí ðề thi, eBook, Tài liệu học tập 95 con bên trái của T, ký hiệu T(u). Tương tự, ta có cây con bên phải T(v) của T. Một cây T(r) có thể không có cây con bên trái hay bên phải. Sau ñây là ba trong các thuật toán duyệt cây nhị phân T(r). Các thuật toán ñều ñược trình bày ñệ quy. Chú ý rằng khi cây T(x) chỉ là môt ñỉnh x thì “duyệt T(x)” có nghĩa là “thăm ñỉnh x”. Thí dụ 5: 6.4.2. Các thuật toán duyệt cây nhị phân: 1) Thuật toán tiền thứ tự: 1. Thăm gốc r. 2. Duyệt cây con bên trái của T(r) theo tiền thứ tự. 3. Duyệt cây con bên phải của T(r) theo tiền thứ tự. Duyệt cây nhị phân T(a) trong hình trên theo tiền thứ tự: 1. Thăm a 2. Duyệt T(b) 2.1. Thăm b 2.2. Duyệt T(d) 2.2.1. Thăm d 2.2.2. Duyệt T(g) 2.2.2.1. Thăm g 2.2.2.3. Duyệt T(l): Thăm l 2.2.3. Duyệt T(h): Thăm h 2.3. Duyệt T(e) 2.3.1. Thăm e 2.3.2. Duyệt T(i) 2.3.2.1. Thăm i 2.3.2.2. Duyệt T(m): Thăm m 2.3.2.3. Duyệt T(n): Thăm n 3. Duyệt T(c) a b c d e f g h i j k q s l m n o p http://ebook.here.vn Tải miễn phí ðề thi, eBook, Tài liệu học tập 96 3.1. Thăm c 3.3. Duyệt T(f) 3.3.1.Thăm f 3.3.2. Duyệt T(j) 3.3.2.1. Thăm j 3.3.2.2. Duyệt T(o): Thăm o 3.3.2.3. Duyệt T(p): Thăm p 3.3.3. Duyệt T(k) 3.3.3.1. Thăm k 3.3.3.2. Duyệt T(q): Thăm q 3.3.3.3. Duyệt T(s): Thăm s Kết quả duyệt cây T(a) theo tiền thứ tự là: a, b, d, g, l, h, e, i, m, n, c, f, j, o, p, k, q, s. 2) Thuật toán trung thứ tự: 1. Duyệt cây con bên trái của T(r) theo trung thứ tự. 2. Thăm gốc r. 3. Duyệt cây con bên phải của T(r) theo trung thứ tự. Duyệt cây nhị phân T(a) trong hình trên theo trung thứ tự: 1. Duyệt T(b) 1.1. Duyệt T(d) 1.1.1. Duyệt T(g) 1.1.1.2. Thăm g 1.1.1.3. Duyệt T(l): thăm l 1.1.2. Thăm d 1.1.3. Duyệt T(h): Thăm h 1.2. Thăm b 1.3. Duyệt T(e) 1.3.1. Duyệt T(i) 1.3.1.1. Duyệt T(m): Thăm m 1.3.1.2. Thăm i 1.3.1.3. Duyệt T(n): Thăm n 1.3.2. Thăm e 2. Thăm a 3. Duyệt T(c) 3.2. Thăm c 3.3. Duyệt T(f) 3.3.1. Duyệt T(j) [...]... ∗ 5c23↑−cd2 ∗ −−acd/↑−b ∗ 3d35 Trư c h t, chú ý r ng các phép toán +, −, *, /, ↑ ñ u là các phép toán hai ngôi, vì v y trong cây nh phân tương ng, các ñ nh mang d u các phép toán ñ u là ñ nh trong và có hai con Các ch và s ñ u ñ t lá Theo ký pháp Ba Lan (t.ư Ba Lan ñ o) thì T a b (t.ư a b T) có nghĩa là a T b, v i T là m t trong các phép toán +, −, *, /, ↑ −*↑ / − − a b*5c 23↑ − c d 2*− − a c d / ↑... m t ñ nh và v i n=3,4, … cây có g c Tn ñư c xây d ng t g c v i Tn-1 như là cây con bên trái và Tn-2 như là cây con bên ph i a) Hãy v 7 cây Fibonacci có g c ñ u tiên b) Cây Fibonacci Tn có bao nhiêu ñ nh, lá và bao nhiêu ñ nh trong Chi u cao c a nó b ng bao nhiêu? 8 Hãy tìm cây khung c a ñ th sau b ng cách xoá ñi các c nh trong các chu trình ñơn a) a b c d e h f g i j 101 http://ebook.here.vn T i mi... các d u ngo c mà không s hi u nh m 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 (187 8-1 956) trong v n ñ này 99 http://ebook.here.vn T i mi n phí ð thi, eBook, Tài li u h c t p Vi c 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... K4,4 c) K1,6 a) K5 d) Q3 e) C5 f) W5 10 ð th Kn v i n=3, 4, 5 có bao nhiêu cây khung không ñ ng c u? 11 Tìm cây khung nh nh t c a ñ th sau theo thu t toán Kruskal và Prim 42 a 10 4 c 3 5 20 7 11 e f 9 15 g 3 14 1 d b h 12 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 A B C D A B C D E F G H E F ∞  16 15   23  19 18 ... 3.3.2 Thăm f 3.3.3 Duy t T(k) 3.3.3.1 Duy t T(q): Thăm q 3.3.3.2 Thăm k 3.3.3.3 Duy t T(s): Thăm s K t qu duy t cây T(a) theo trung th t là: g, l, d, h, b, m, i, n, e, a, c, o, j, p, f, q, k, s 3) Thu t toán h u th t : 1 Duy t cây con bên trái c a T(r) theo h u th t 2 Duy t cây con bên ph i c a T(r) theo h u th t 3 Thăm g c r Duy t cây nh phân T(a) trong hình trên theo h u th t : 1 Duy t T(b) 1.1 Duy... CHƯƠNG VI: 1 V t t c các cây (không ñ ng c u) có: a) 4 ñ nh b) 5 ñ nh c) 6 ñ nh 2 M t cây có n2 ñ nh b c 2, n3 ñ nh b c 3, …, nk ñ nh b c k H i có bao nhiêu ñ nh b c 1? 3 Tìm s t i ña các ñ nh c a m t cây m-phân có chi u cao h 4 Có th tìm ñư c m t cây có 8 ñ nh và tho ñi u ki n dư i ñây hay không? N u có, v cây ñó ra, n u không, gi i thích t i sao: a) M i ñ nh ñ u có b c 1 b) M i ñ nh ñ u có b c 2 c) Có... t ng bư c l p, k t qu cu i cùng c n ñưa ra t p c nh và ñ dài c a cây khung nh nh t 102 http://ebook.here.vn T i mi n phí ð thi, eBook, Tài li u h c t p 13 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 a) b) a b d a c e b f g d j i e h h c i m f j k n p g o q 14 Vi t các bi u th c sau ñây theo ký pháp Ba Lan và ký pháp Ba Lan ñ o a) ( A + B )(C + D) A 2 + BD . nhất. Bài toán này cũng dẫn về bài toán tìm cây khung nhỏ nhất. Bài toán tìm cây khung nhỏ nhất ñã có những thuật toán rất hiệu quả ñể giải chúng. Ta sẽ xét hai trong số những thuật toán như. ñó sẽ tạo ra một chu trình và khi bỏ một cạnh thuộc chu trình này, T vẫn liên thông, trái với giả thiết. 5)⇒ ⇒⇒ ⇒6) Nếu T chứa một chu trình thì hai ñỉnh bất kỳ trên chu trình này sẽ ñược nối. chúng. Ta sẽ xét hai trong số những thuật toán như vậy: thuật toán Kruskal và thuật toán Prim. 6.2.3. Thuật toán Kruskal: Thuật toán sẽ xây dựng tập cạnh E T của cây khung nhỏ nhất T=(V T ,

Ngày đăng: 01/07/2014, 17:20

TỪ KHÓA LIÊN QUAN