1. Trang chủ
  2. » Luận Văn - Báo Cáo

Giáo trình toán rời rạc

176 3 0
Tài liệu đã được kiểm tra trùng lặp

Đ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 176
Dung lượng 1,77 MB

Nội dung

ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC SƯ PHẠM CHỦ BIÊN: TS NGUYỄN ĐÌNH LẦU Tác giả tham gia: TS Phạm Anh Phương, TS Trần Văn Hưng GIÁO TRÌNH TỐN RỜI RẠC Đà Nẵng, tháng 02/2023 Tai ngay!!! Ban co the xoa dong chu nay!!! 16990019264811000000 B i MỤC LỤC MỤC LỤC i LỜI NÓI ĐẦU iv DANH MỤC HÌNH vii DANH MỤC BẢNG x CHƯƠNG CÁC KIẾN THỨC CƠ SỞ Tóm tắt chương 1.1 Thuật toán 1.1.1 Khái niệm 1.1.2 Đánh giá độ phức tạp thuật toán 1.2 Quy nạp toán học đệ quy 1.2.1 Quy nạp toán học 1.2.2 Giải thuật đệ quy Bài tập chương 11 Chương BÀI TOÁN ĐẾM 12 Tóm tắt chương 12 2.1 Tập hợp 12 2.1.1 Các khái niệm 12 2.1.2 Các phép toán tập hợp 13 2.2 Các nguyên lý đếm 13 2.2.1 Nguyên lý cộng 13 2.2.2 Nguyên lý nhân 14 2.2.3 Nguyên lý bù trừ 14 2.3 Giải tích tổ hợp 16 2.3.1 Chỉnh hợp lặp 16 2.3.2 Hoán vị 17 2.3.3 Tổ hợp 18 2.3.4 Hoán vị lặp 18 2.3.5 Tổ hợp lặp 18 2.4 Hệ thức truy hồi 19 ii 2.4.1 Công thức truy hồi 19 2.4.2 Giải công thức truy hồi phương pháp lặp 20 2.4.3 Giải cơng thức truy hồi phương trình đặc trưng 20 Bài tập chương 22 Chương BÀI TOÁN TỒN TẠI 24 Tóm tắt chương 24 3.1 Giới thiệu số toán tồn 24 3.2 Nguyên lý Dirichlet 27 Bài tập chương 29 Chương BÀI TOÁN LIỆT KÊ 30 Tóm tắt chương 30 4.1 Phát biểu toán 30 4.2 Phương pháp sinh 30 4.2.1 Thứ tự từ điển 30 4.2.2 Phương pháp sinh 31 4.3 Các thuật toán phương pháp sinh 31 4.3.1 Liệt kê dãy nhị phân 31 4.3.2 Liệt kê tổ hợp chập r từ n phần tử 34 4.3.3 Liệt kê hoán vị 38 4.3.4 Kiệt kê dãy tập 41 4.3.5 Liệt kê dãy bị chặn 43 4.4 Phương pháp quay lui 47 4.5 Các thuật toán phương pháp quay lui 50 4.5.1 Liệt kê dãy nhị phân có độ dài n 50 4.5.2 Liệt kê hoán vị 51 4.5.3 Tổ hợp chập r từ n phần tử 53 Bài Tập chương 55 Chương TỐI ƯU MẠCH TỔ HỢP 56 Tóm tắt chương 56 5.1 Đại số Boole 56 iii 5.2 Biểu diễn hàm Boole 58 5.2.1 Hàm Boole 58 5.2.2 Biểu diễn hàm Boole 60 5.3 Mạch tổ hợp 68 5.4 Cực tiểu hóa mạch tổ hợp 71 5.4.1 Bài toán cực tiểu hoá mạch 71 5.4.2 Phương pháp đồ Karnaugh 73 5.4.3 Rút gọn biểu thức Boole biến 73 5.4.4 Rút gọn biểu thức Boole biến 75 Bài tập chương 79 Chương ĐẠI CƯƠNG VỀ ĐỒ THỊ 82 Tóm tắt chương 82 6.1 Các khái niệm 82 6.1.1 Đồ thị, đỉnh, cạnh, cung 82 6.1.2 Đường đi, chu trình, liên thơng 85 6.2 Biểu diễn đồ thị 89 6.2.1 Ma trận kề 89 6.2.2 Ma trận liên thuộc 91 6.3 Đồ thị đẳng cấu 93 6.4 Đồ thị phẳng 94 Bài tập chương 95 Chương CÁC BÀI TOÁN VỀ ĐƯỜNG ĐI 97 Tóm tắt chương 97 7.1 Đồ thị euler 97 7.1.1 Định nghĩa 97 7.1.2 Điều kiện cần đủ 98 7.1.3 Các thuật tốn tìm chu trình Euler 100 7.2 Tìm đường ngắn 106 7.2.1 Phát biểu toán 106 7.2.2 Thuật toán Dijkstra 106 iv 7.2.3 Thuật toán Floyd 114 7.3.4 Thuật toán Floyd mở rộng (Floyd-Warshall) 116 7.3 Đồ thị Hamilton 124 7.3.1 Định nghĩa 124 7.3.2 Điều kiện cần 124 7.3.3 Điều kiện đủ 128 7.3.4 Mã Gray 128 Bài tập chương 131 CHƯƠNG CÂY 135 Tóm tắt chương 135 8.1 Các khái niệm 135 8.1.1 Định nghĩa 135 8.1.2 Định lý tương đương (Định lý 1) 136 8.1.3 Cây m-phân 137 8.2 Cây phủ 139 8.2.1 Định nghĩa tính chất 139 8.2.2 Các thuật tốn tìm phủ 139 8.3 Cây phủ nhỏ 147 8.3.1 Phát biểu toán 147 8.3.2 Thuật tốn Prim tìm phủ nhỏ 147 8.3.3 Thuật tốn Kruskal tìm phủ nhỏ 152 8.3.4 Ứng dụng 156 8.4 Cây nhị phân tìm kiếm 157 8.4.1 Cây nhị phân 157 8.4.2 Duyệt 157 8.4.3 Cây nhị phân tìm kiếm (binary search tree) 160 Bài tập chương 162 TÀI LIỆU THAM KHẢO 163 v LỜI NĨI ĐẦU Tốn rời rạc lĩnh vực nghiên cứu đối tượng rời rạc để giải toán đếm đối tượng, liệt kê đối tượng rời rạc, nghiên cứu mối quan hệ tập hợp, phân tích q trình hữu hạn Việc cất giữ, lưu trữ xử lý thông tin máy tính chất q trình rời rạc Boole nhà khoa học tiên phong nghiên cứu chế biểu diễn q trình tư lơgic Năm 1854 ông viết Các qui luật tư Đóng góp lớn Boole phát triển lý thuyết lôgic ký hiệu thay cho từ ngữ sử dụng đại số Boole, hàm Boole để thiết kế mạch tổ hợp từ nghiên cứu mạch điện Đồ thị cấu trúc rời rạc gồm đỉnh cung nối đỉnh Đây cơng cụ hữu hiệu để mơ hình hố giải toán nhiều lĩnh vực khoa học, kỹ thuật, kinh tế, xã hội, Chẳng hạn, đồ thị sử dụng để xác định mạch vịng vấn đề giải tích mạch điện Chúng ta phân biệt hợp chất hố học hữu khác với công thức phân tử khác cấu trúc phân tử nhờ đồ thị Chúng ta xác định xem hai máy tính mạng trao đổi thơng tin với hay khơng nhờ mơ hình đồ thị mạng máy tính Đồ thị có trọng số cạnh sử dụng để giải tốn tìm đường ngắn hai thành phố mạng giao thơng Ngồi ra, xử dụng đồ thị để giải toán lập lịch, thời khoá biểu, phân bố tầng số cho trạm phát truyền hình Những tư tưởng lý thuyết đồ thị đề xuất vào năm đầu kỹ 18 nhà toán học lỗi lạc người Thuỵ Sỹ Leonhard Euler Chính ơng người xử dụng đồ thị để giải toán tiếng cầu thành phố Konigsberg Giáo trình nhằm giới thiệu kiến thức ba lĩnh vực có nhiều ứng dụng toán rời rạc Lĩnh vực thức tập trung nghiên cứu thuật toán, độ phức tạp thuật tốn, cơng thức truy hồi, quy nạp tốn học, lý thuyết tổ hợp, nguyên lý tổ hợp, toán đếm, toán tồn toán liệt kê Lĩnh vực thứ hai tập trung nghiên cứu hàm đại số logic, đại số Boole, biểu diễn hàm Boole, xây dựng mạch tổ hợp cực tiểu hoá mạch tổ hợp để thiết kế mạch tổ hợp Lĩnh vực thứ ba lý thuyết đồ thị tập trung nghiên cứu khái niệm đồ thị, biểu diễn đồ thị, đồ thị Hamilton, đồ thị Euler, toán đường toán phủ… Chúng xin chân thành cám ơn đồng nghiệp, nhà khoa học động vi viên góp ý cho giáo trình Tốn rời rạc lời cám ơn đặc biệt xin dành cho Trường Đại học Sư phạm, Khoa Tin học giúp đỡ quý báu tạo điều kiện thuận lợi cho việc xuất giáo trình Nhóm tác giả mong tiếp tục nhận góp ý đồng nghiệp độc giả thiếu sót khó tránh khỏi giáo trình Tác giả Nguyễn Đình Lầu vii DANH MỤC HÌNH Hình 1.1 Sơ đồ khối thuật tốn giải phương trình bậc Hình 1.2 Sơ đồ khối thuật tốn tìm số lớn dãy Hình 3.1 Bài tốn 19 hình lục giác thần bí 26 Hình 4.1 Sơ đồ khối thuật toán liệt kê dãy 33 Hình 4.2 Sơ đồ khối liệt kê tổ hợp chập r n phần tử 36 Hình 4.3 Sơ đồ khối liệt kê hốn vị 39 Hình 4.4 Mơ tả thuật tốn quay lui 49 Hình 4.5 Quay lui liệt kê dãy nhị phân n=3 51 Hình 4.6 Mơ tả thuật tốn quay lui liệt kê dãy hoán vị với n=3 52 Hình 4.7 Mơ tả thuật toán quay lui liệt kê dãy tổ hợp chập r=3 n=4 54 Hình 5.1 Mạch tổ hợp u chưa xác định 69 Hình 5.2 Mạch tổ hợp u xác định 70 Hình 5.3 Mạch tổ hợp bước 70 Hình 5.4 Mạch tổ hợp bước 70 Hình 5.5 Mạch tổ hợp bước 70 Hình 5.6 Mạch tổ hợp bước 70 Hình 5.7 Mạch tổ hợp bước 71 Hình 5.8 Mạch tổ hợp ứng với lời giải 72 Hình 5.9 Mạch tổ hợp rút gọn 73 Hình 6.1 Đồ thị đỉnh cạnh 82 Hình 6.2 Đồ thị đỉnh cạnh 82 Hình 6.3 Đồ thị có hướng đỉnh cung 82 Hình 6.4 Đồ thị có hướng đỉnh cung 83 Hình 6.5 Đồ thị đơn 83 Hình 6.6 Đồ thị vơ hướng đỉnh 84 Hình 6.7 Đồ thị có hướng đỉnh 84 Hình 6.8 Đồ thị K5 85 Hình 6.9 Đồ thị vơ hướng đỉnh 86 Hình 6.10 Đồ thị gán trọng số 87 Hình 6.11 Các thành phần liên thơng 88 Hình 6.12 Đồ thị G1 G2 có trọng số 89 Hình 6.13 Đồ thị vơ hướng đỉnh 90 Hình 6.14 Đồ thị có hướng đỉnh 90 viii Hình 6.15 Đồ thị vơ hướng có trọng số 91 Hình 6.16 Đồ thị vơ hướng có cạnh liên thuộc 92 Hình 6.17 Đồ thị có hướng có cung liên thuộc 92 Hình 6.18 Hai đồ thị đẳng cấu 93 Hình 6.19 Hai đồ thị đẳng cấu G1 G2 94 Hình 6.20 Đồ thị phẳng 94 Hình 7.1 Biểu diễn chu trình Euler 97 Hình 7.2 Biểu diễn đường Euler 98 Hình 7.3 Đồ thị khơng có chu trình đường Euler 98 Hình 7.4 Đồ thị đỉnh khuyên 99 Hình 7.5 Đồ thị đỉnh 99 Hình 7.6 Đồ thị đỉnh 100 Hình 7.7 Đồ thị có hướng đỉnh 100 Hình 7.8 Sơ đồ khối cho thuật tốn tìm chu trình Euler 102 Hình 7.9 Đồ thị mã tấu Mohammed 103 Hình 7.10 Đồ thị mã tấu Mohammed xoá chu trình 103 Hình 7.11 Đồ thị mã tấu Mohammed xoá đỉnh 104 Hình 7.12 Đồ thị đỉnh 105 Hình 7.13 Sơ đồ thuật toán Dijkstra 108 Hình 7.14 Đồ thị có hướng đỉnh 109 Hình 7.15 Đồ thị gán nhãn khởi tạo 110 Hình 7.16 Đồ thị gán nhãn bước 110 Hình 7.17 Đồ thị gán nhãn bước 111 Hình 7.18 Đồ thị gán nhãn bước 111 Hình 7.19 Đồ thị có hướng 11 đỉnh 112 Hình 7.20 Đồ thị có hướng 11 đỉnh gán nhãn 113 Hình 7.21 Đồ thị dùng lập bảng 113 Hình 7.22 Đồ thị biểu diễn thuật toán Floyd 115 Hình 7.23 Đồ thị biểu diễn thuật toán Floyd mở rộng 118 Hình 7.24 Đồ thị biểu diễn chu trình Hamilton 124 Hình 7.25 Đồ thị G1 G2 125 Hình 7.26 Đồ thị xếp chỗ ngồi lần 126 Hình 7.27 Đồ thị xếp chỗ ngồi lần 126 Hình 7.28 Đồ thị xếp chỗ ngồi lần 127 Hình 7.29 Đồ thị xếp chỗ ngồi lần 127 149 Thuật toán sơ đồ khối Begin Input( (G=V,E,cij)) T (X,Y), X:={a| a∈ V}, Y:={} |Y|=|V|-1 T F T phủ M = { (i,j)E  iT & j T } End T F M= ckh = min{cij  (i,j)M} Y=Y∪(k,h) X=X∪h G không liên thông End Hình 8.7 Sơ đồ khối thuật tốn Prim 150 Ví dụ Cho đồ thị có trọng số sau đây, tìm phủ nhỏ theo thuật tốn Prim e 12 b d 11 a i 15 f c 11 j h g Hình 8.8 Đồ thị biểu diễn thuật tốn Prim Giải: Bước 1: Khởi tạo: T có đỉnh a, khơng có cạnh: T := ({a},), d(T) := Bước 2: Kiểm tra: Số cạnh T < (n-1), sang bước (3) Bước 3: Thêm cạnh: Tập M M = {(a,b), (a,c), (a,i)} Ta có cab = = min{cij | (i,j)M} Thêm đỉnh b cạnh (a,b) vào T, T: = ({a,b},{(a,b)}), d(T) := d(T) + cab = Bước 2: Kiểm tra: Số cạnh T < (n-1), sang bước (3) Bước 3: Thêm cạnh: Tập M M = {(a,c), (a,i), (b,c)} Ta có cac = = min{cij | (i,j)M} Thêm đỉnh c cạnh (a,c) vào T, T: = ({a,b,c},{(a,b), (a,c)}), d(T) := d(T) + cac = 5+8=13 Bước 2: Kiểm tra: Số cạnh T < (n-1), sang bước (3) Bước 3: Thêm cạnh: Tập M M = {(a,i), (c,d), (c,f)} Ta có Ccd = = min{cij | (i,j)M} Thêm đỉnh d cạnh (c,d) vào T, T: = ({a,b,c,d},{(a,b), (a,c), (c,d)}), d(T) := d(T) + ccd = 13+7=20 Bước 2: Kiểm tra: Số cạnh T < (n-1), sang bước (3) Bước 3: Thêm cạnh: Tập M M = {(a,i), (c,f), (d,e), (d,f)} Ta có Ccf = = min{cij | (i,j)M} Thêm đỉnh f cạnh (c,f) vào T, 151 T: = ({a,b,c,d,f},{(a,b), (a,c), (c,d), (c,f)}), d(T) := d(T) + ccf = 20+7=27 Bước 2: Kiểm tra: Số cạnh T < (n-1), sang bước (3) Bước 3: Thêm cạnh: Tập M M = {(a,i), (d,e), (f,g)} Ta có Cfg = = min{cij | (i,j)M} Thêm đỉnh g cạnh (f,g) vào T, T: = ({a,b,c,d,f,g},{(a,b), (a,c), (c,d), (c,f), (f,g)}), d(T) := d(T) + cfg = 27+6=33 Bước 2: Kiểm tra: Số cạnh T < (n-1), sang bước (3) Bước 3: Thêm cạnh: Tập M M = {(a,i), (d,e), (g,h)} Ta có Cgh = = min{cij | (i,j)M} Thêm đỉnh h cạnh (g,h) vào T, T: = ({a,b,c,d,f,g,h},{(a,b), (a,c), (c,d), (c,f), (f,g), (g,h)}), d(T) := d(T) + cgh = 33+4=37 Bước 2: Kiểm tra: Số cạnh T < (n-1), sang bước (3) Bước 3: Thêm cạnh: Tập M M = {(a,i), (d,e), (h,i), (h,j)} Ta có Cai = = min{cij | (i,j)M} Thêm đỉnh i cạnh (a,i) vào T, T: = ({a,b,c,d,f,g,h,i},{(a,b), (a,c), (c,d), (c,f), (f,g), (g,h), (a,i)}), d(T) := d(T) + cai = 37+9=46 Bước 2: Kiểm tra: Số cạnh T 7< (n-1), sang bước (3) Bước 3: Thêm cạnh: Tập M M = {(d,e), (h,j), (i,j)} Ta có Cij = 11 = min{cij | (i,j)M} Thêm đỉnh j cạnh (i,j) vào T, T: = ({a,b,c,d,f,g,h,i,j},{(a,b), (a,c), (c,d), (c,f), (f,g), (g,h), (a,i), (i,j)}), d(T) := d(T) + cij = 46+11=57 Bước 2: Kiểm tra: Số cạnh T 8< (n-1), sang bước (3) Bước 3: Thêm cạnh: Tập M M = {(d,e)} Ta có Cde = 12 = min{cij | (i,j)M} Thêm đỉnh e cạnh (d,e) vào T, T: = ({a,b,c,d,f,g,h,i,j,e},{(a,b), (a,c), (c,d), (c,f), (f,g), (g,h), (a,i), (i,j), (d,e)}), d(T) := d(T) + cde = 57+12=69 Bước 2: Kiểm tra: Số cạnh T 9= n-1, nên kết thúc, Trọng số T 69 Cây qua cạnh nét đứt đồ thị 152 8.3.3 Thuật tốn Kruskal tìm phủ nhỏ - Đầu vào: Đồ thị G= (V, E) có n đỉnh Trọng số cạnh (i,j), (i,j)E, ký hiệu cij - Đầu ra: Cây phủ nhỏ T, kết luận đồ thị không liên thông - Các bước Bước 1: Khởi tạo T := (V, ) đồ thị gồm đỉnh G khơng có cạnh Bước 2: Kiểm tra điều kiện kết thúc Nếu T có n−1 cạnh, kết luận: T phủ nhỏ nhất, kết thúc Ngược lại sang bước Bước 3: Thêm cạnh Chọn cạnh có trọng số nhỏ không thuộc T cho thêm cạnh vào T khơng tạo chu trình T Quay lại bước Ngược lại, không chọn cạnh thêm vào T, kết luận đồ thị G khơng liên thơng, kết thúc 153 Thuật tốn sơ đồ khối Begin Input( (G=V,E,cij)) T (V,Y), Y:={}, D={} |Y|=|V|-1 F ckh = min{cij  (i,j)E\Y && (i,j)∉ D T phủ T D=D∪(k,h) ∄(k,h) Type equation here F (k,h)∪Y ∄ chu trình ∈T F G khơng liên thơng T T Y=Y∪(k,h) End Hình 8.9 Sơ đồ khối thuật tốn Kruskal End 154 Ví dụ Cho đồ thị có trọng số sau đây, tìm phủ nhỏ theo thuật toán Kruskal e 12 b d 11 a 11 i j 15 f c h g Hình 8.10 Đồ thị biểu diễn thuật toán Kruskal Giải: Bước 1: Khởi tạo: T := ({a,b,c,d,e,f,g,h,i,j}, ), khơng có cạnh, số cạnh 0, trọng số d(T):=0 Bước Kiểm tra: Số cạnh T < (n-1), sang bước Bước Thêm cạnh: Trong cạnh không thuộc T cạnh (g,h) có độ dài nhỏ Thêm cạnh (g,h) vào T Ta có T = ({a,b,c,d,e,f,g,h,i,j}, {(g,h)}) , d(T):=d(T)+4=4 số cạnh Bước Kiểm tra: Số cạnh T < (n-1), sang bước Bước Thêm cạnh: Trong cạnh khơng thuộc T cạnh (a,b) có độ dài nhỏ Thêm cạnh (a,b) vào T Ta có T = ({a,b,c,d,e,f,g,h,i,j}, {(g,h), (a,b)}) , d(T):=d(T)+5=9 số cạnh Bước Kiểm tra: Số cạnh T < (n-1), sang bước Bước Thêm cạnh: Trong cạnh không thuộc T cạnh (f,g) có độ dài nhỏ Thêm cạnh (f,g) vào T Ta có T = ({a,b,c,d,e,f,g,h,i,j}, {(g,h), (a,b), (f,g)}) , d(T):=d(T)+6=15 số cạnh 155 Bước Kiểm tra: Số cạnh T < (n-1), sang bước Bước Thêm cạnh: Trong cạnh khơng thuộc T cạnh (f,g) có độ dài nhỏ Thêm cạnh (f,g) vào T Ta có T = ({a,b,c,d,e,f,g,h,i,j}, {(g,h), (a,b), (f,g)}) , d(T):=d(T)+6=15 số cạnh Bước Kiểm tra: Số cạnh T < (n-1), sang bước Bước Thêm cạnh: Trong cạnh không thuộc T cạnh (c,d) có độ dài nhỏ Thêm cạnh (c,d) vào T Ta có T = ({a,b,c,d,e,f,g,h,i,j}, {(g,h), (a,b), (f,g), (c,d)}) , d(T):=d(T)+7=22 số cạnh Bước Kiểm tra: Số cạnh T 4< (n-1), sang bước Bước Thêm cạnh: Trong cạnh khơng thuộc T cạnh (c,f) có độ dài nhỏ Thêm cạnh (c,f) vào T Ta có T = ({a,b,c,d,e,f,g,h,i,j}, {(g,h), (a,b), (f,g), (c,d), (c,f) }) , d(T):=d(T)+7=29 số cạnh Bước Kiểm tra: Số cạnh T < (n-1), sang bước Bước Thêm cạnh: Trong cạnh khơng thuộc T cạnh (a,c) có độ dài nhỏ Thêm cạnh (a,c) vào T Ta có T = ({a,b,c,d,e,f,g,h,i,j}, {(g,h), (a,b), (f,g), (c,d), (c,f), (a,c)}) , d(T):=d(T)+8=37 số cạnh Bước Kiểm tra: Số cạnh T < (n-1), sang bước Bước Thêm cạnh: Trong cạnh không thuộc T cạnh (a,i) có độ dài nhỏ (cạnh (d,f)=8 khơng chọn tạo thành chu trình) 156 Thêm cạnh (a,c) vào T Ta có T = ({a,b,c,d,e,f,g,h,i,j}, {(g,h), (a,b), (f,g), (c,d), (c,f), (a,c), (a,i)}) , d(T):=d(T)+9=45 số cạnh Bước Kiểm tra: Số cạnh T < (n-1), sang bước Bước Thêm cạnh: Trong cạnh không thuộc T cạnh (i,j) có độ dài nhỏ 11 (cạnh (i,h)=9 khơng chọn tạo thành chu trình) Thêm cạnh (i,j) vào T Ta có T = ({a,b,c,d,e,f,g,h,i,j}, {(g,h), (a,b), (f,g), (c,d), (c,f), (a,c), (a,i), (i,j)}) , d(T):=d(T)+11=56 số cạnh Bước Kiểm tra: Số cạnh T < (n-1), sang bước Bước Thêm cạnh: Trong cạnh không thuộc T cạnh (d,e) có độ dài nhỏ 12 (cạnh (b,c)=11 khơng chọn tạo thành chu trình) Thêm cạnh (d,e) vào T Ta có T = ({a,b,c,d,e,f,g,h,i,j}, {(g,h), (a,b), (f,g), (c,d), (c,f), (a,c), (a,i), (i,j), (d,e)}) , d(T):=d(T)+12=68 số cạnh Bước Kiểm tra: Số cạnh T 9= n-1, kết luận T phủ nhỏ nhất, cạnh T cạnh nét đứt có d(T)=68 8.3.4 Ứng dụng a) Xây dựng hệ thống đường sắt Giả sử ta muốn xây dựng hệ thống đường sắt nối n thành phố cho hai thành phố thơng thương với Nếu biết trước chi phí xây dựng tuyến đường tốn đặt phải xây dựng tuyến đường để tổng chi phí xây dựng Nếu ta coi thành phố đỉnh tuyến đường nối thành phố cạnh kèm theo chi phí xây dựng ta có trọng đồ Khi tốn quy tìm phủ bé đồ thị b) Bài toán phủ lớn Cho G = (V, E, (cij)) đồ thị liên thơng có trọng số (cij) Tìm phủ T 157 G có tổng trọng số d(T) lớn 𝑑 (𝑇) = ∑ 𝑐𝑖𝑗 (𝑖,𝑗)∈𝑇 Xét trọng đồ G’ = (V, E, (−cij)) áp dụng thuật tốn tìm phủ nhỏ Prim Kruskal (vì chúng khơng phụ thuộc dấu trọng số) ta tìm phủ nhỏ T* đồ thị G’ thỏa Như T* phủ lớn đồ thị G 8.4 Cây nhị phân tìm kiếm 8.4.1 Cây nhị phân Cây nhị phân dạng cấu trúc quan trọng, nút có tối đa hai nút Với nút nhị phân, xuất phát từ nút trái gọi trái xuất phát từ nút phải gọi phải Ví dụ Cây sau nhị phân v1 v2 v3 v4 v5 v6 v7 v8 Hình 8.11 Cây nhị phân 8.4.2 Duyệt Phép duyệt qua tất nút nút qua lần Có cách duyệt dựa vào thứ tự duyệt nút bên trái (L), nút gốc (N) nút bên phải (R) là: - Thứ tự Preorder: NLR, NRL (nút gốc trước) - Thứ tự Inorder: LNR, RNL (nút gốc giữa) - Thứ tự Postorder: LRN, RLN (nút gốc sau) Ví dụ Cây sau nhị phân Duyệt nhị phân theo thứ tự 158 A B F C D H K E Hình 8.12 Cây nhị phân có nút chữ Thứ tự Preorder: NLR: ABCDEFHK, NRL: AFKHBDEC Thứ tự Inorder: LNR: CBEDAHFK, RNL: KFHADEBC Thứ tự Postorder: LRN: CEDBHKFA, RLN: KHFEDCBA Nhận xét: - NLR đối xứng với RLN - LNR đối xứng với RNL - LRN đối xứng với NRL Do ta xét ba phép duyệt NLR, LNR, LRN a) Thuật toán duyệt theo thứ tự NLR - Preorder (Giải thuật đệ quy) - Đầu vào Gốc r nhị phân - Đầu Danh sách liệu nút - Phương pháp Duyệt gốc Duyệt bên trái Duyệt bên phải void Traverse_NLR (pointer *r) { if (r NULL) { coutLeft); Traverse_NLR(r->Right); } } b) Thuật toán duyệt theo thứ tự LNR - Inorder (giải thuật đệ quy) - Đầu vào Gốc r nhị phân - Đầu Danh sách liệu nút - Phương pháp Duyệt bên trái Duyệt gốc Duyệt bên phải void Traverse_LNR ( pointer *r) { if (r NULL) { Traverse_LNR(r->Left); coutRight); } } c) Thuật toán 3.4.3 Duyệt theo thứ tự LRN - Postorder: (giải thuật đệ quy) - Đầu vào Gốc r nhị phân - Đầu Danh sách liệu nút - Phương pháp Duyệt bên trái Duyệt bên phải Duyệt gốc void Traverse_LRN (pointer *r) { if (r NULL) { 160 Traverse_LRN(r->Left); Traverse_LRN(r->Right); cout

Ngày đăng: 03/11/2023, 18:09