Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 269 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
269
Dung lượng
9,2 MB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC MỞ HÀ NỘI CẤU TRÚC DỮ LIỆU & GIẢI THUẬT Trương Tiến Tùng – Nguyễn Thị Tâm - Trịnh Thị Xuân HÀ NỘI 6/2021 (Lưu hành nội bộ) Cấu trúc liệu giải thuật LỜI NÓI ĐẦU Để đáp ứng nhu cầu học tập bạn sinh viên đặc biệt sinh viên chuyên ngành Công nghệ thông tin, Khoa Công nghệ thông tin Trường Đại học Mở Hà Nội, chúng tơi biên soạn giáo trình, giảng chương trình đào tạo theo hệ thống tín Bài giảng mơn Cấu trúc liệu thuật tốn biên soạn dựa "Cấu trúc liệu thuật toán" tác giả Đinh Mạnh Tường, Nhà xuất Khoa học Kỹ thuật "Algorithms + Data Structure = Program" Nicklaus Wirth, Bản dịch tiếng Việt, Nhà xuất Khoa học Kỹ thuật, 1993 Giáo trình biên soạn dựa kinh nghiệm giảng dạy nhiều năm môn Cấu trúc liệu Giải thuật chúng tơi Giáo trình biên soạn theo đề cương chi tiết môn Cấu trúc liệu Giải thuật sinh viên chuyên ngành Công nghệ thông tin Khoa Công nghệ Thông tin Trường Đại học Mở Hà Nội Mục tiêu nhằm giúp bạn sinh viên có tài liệu dùng làm tài liệu học tập song đối tượng khác tham khảo Chúng tơi cho bạn sinh viên không chuyên tin người quan tâm tới cấu trúc liệu giải thuật tìm nhiều điều bổ ích Mặc dù cố gắng trình biên soạn giáo trình chán giáo trình cịn nhiều thiếu sót hạn chế Nhóm tác giả mong nhận đóng góp ý kiến bạn sinh viên người đọc để giáo trình ngày hồn thiện Hà Nội, tháng năm 2021 Nhóm tác giả Trương Tiến Tùng Nguyễn Thị Tâm Trịnh Thị Xuân Cấu trúc liệu giải thuật MỤC LỤC Chương CÁC KHÁI NIỆM CƠ BẢN 12 1.1 Các khái niệm 12 1.2 Các bước phân tích thuật tốn 17 1.3 Biểu diễn giải thuật 18 1.3.1 Ngôn ngữ tự nhiên – liệt kê theo bước 18 1.3.2 Sơ đồ khối 19 1.3.3 Mã giả 22 1.4 Phân tích – Đánh giá giải thuật 23 1.4.1 Độ phức tạp không gian 24 1.4.2 Độ phức tạp thời gian 24 1.4.3 Ước lượng thời gian thực chương trình 25 1.4.4 Ngun tắc tính tốn thời gian chạy thực chương trình 26 1.5 Độ phức tạp tính tốn với tình trạng liệu vào 28 1.6 Phân lớp toán 28 1.7 Đệ quy 30 1.7.1 Giới thiệu 30 1.7.2 Giải thuật đệ quy 30 1.7.3 Ví dụ minh họa 32 1.8 Tổng kết chương câu hỏi ôn tập 35 1.8.1 Tổng kết chương 35 1.8.2 Câu hỏi ôn tập 36 1.9 Bài tập áp dụng 36 Chương DANH SÁCH 40 2.1 Danh sách 40 2.1.1 Khái niệm 40 2.1.2 Các phép toán danh sách 41 2.2 Cài đặt danh sách mảng 42 2.2.1 Cài đặt 42 2.2.2 Bài tốn tìm kiếm danh sách 45 2.2.3 Bài toán xếp danh sách 48 2.3 Cài đặt danh sách danh sách liên kết 66 Cấu trúc liệu giải thuật 2.3.1 Khái niệm 66 2.3.2 Các phép toán danh sách liên kết 68 2.3.3 So sánh cài đặt danh sách theo hai phương pháp 76 2.3.4 Các dạng danh sách liên kết khác 77 2.4 Bài tập có hướng dẫn 78 2.5 Tổng kết chương 82 2.6 Câu hỏi trắc nghiệm 82 2.7 Câu hỏi tập 95 Chương NGĂN XẾP – HÀNG ĐỢI 97 3.1 Ngăn xếp - Stack 97 3.1.1 Khái niệm 97 3.1.2 Cài đặt mảng 98 3.1.3 Cài đặt danh sách liên kết 101 3.1.4 Ứng dụng ngăn xếp 103 3.2 Hàng đợi – Queue 106 3.2.1 Khái niệm 106 3.2.2 Cài đặt mảng 106 3.2.3 Cài đặt hàng đợi danh sách liên kết 108 3.2.4 Ứng dụng hàng đợi để biểu diễn đa thức 110 3.3 Tổng kết chương 111 3.4 Bài tập 112 Chương HÀM BĂM – BẢNG BĂM 114 4.1 Khái niệm hàm băm – phép băm 114 4.2 Các loại hàm băm 114 4.2.1 Hàm băm sử dụng phương pháp chia 114 4.2.2 Hàm băm sử dụng phương pháp nhân 115 4.2.3 Hàm băm sử dụng phương pháp trích 116 4.2.4 Hàm băm sử dụng phương tách 116 4.2.5 Hàm băm sử dụng phương gập 116 4.3 Bảng băm 117 4.3.1 Giới thiệu 117 4.3.2 Các bảng băm 118 Cấu trúc liệu giải thuật 4.4 Ứng dụng hàm băm 123 4.5 Tổng kết chương câu hỏi ôn tập 125 4.5.1 Tổng kết chương 125 4.5.2 Câu hỏi ôn tập 125 4.6 Một số câu hỏi trắc nghiệm ôn tập 126 4.7 Bài tập áp dụng 127 Chương DANH SÁCH PHI TUYẾN DẠNG CÂY - TREE 129 5.1 Các khái niệm – Định nghĩa 129 5.2 Cài đặt 134 5.2.1 Cài đặt danh sách – mảng nút cha 134 5.2.2 Lưu trữ móc nối – danh sách nút 137 5.3 Cây nhị phân – nhị phân tìm kiếm 139 5.4 Lưu trữ nhị phân 141 5.4.1 Lưu trữ dạng mảng 141 5.4.2 Lưu trữ móc nối 145 5.5 Biểu diễn tổng quát nhị phân 147 5.6 Các thao tác nhị phân tìm kiếm 148 5.6.1 Các phép duyệt 148 5.6.2 Tìm kiếm nhị phân tìm kiếm 151 5.6.3 Chèn thêm phần tử vào 152 5.6.4 Xóa phần tử khỏi 159 5.7 Cây biểu thức 161 5.7.1 Định nghĩa cách biểu diễn biểu thức 161 5.7.2 Chuyển từ biểu thức sang ký pháp Balan đảo ngược 164 5.7.3 Xây dựng nhị phân biểu thức 165 5.7.4 Tính giá trị biểu thức 174 5.8 Bài toán áp dụng 178 5.8.1 Sắp xếp danh sách theo phương pháp vun đống – Heap Sort 178 5.8.2 Cây 2-3-4 185 5.9 Ví dụ tổng hợp 187 5.10 Tổng kết chương câu hỏi ôn tập 191 5.10.1 Tổng kết chương 191 Cấu trúc liệu giải thuật 5.10.2 Câu hỏi ôn tập 191 5.11 Một số câu hỏi trắc nghiệm ôn tập 192 5.12 Bài tập áp dụng 202 5.13 Bài tập có hướng dẫn 205 Chương ĐỒ THỊ - GRAPH 214 6.1 Các khái niệm – Định nghĩa 214 6.1.1 Giới thiệu 214 6.1.2 Các định nghĩa 215 6.1.3 Các thuật ngữ 218 6.2 Lưu trữ đồ thị 219 6.2.1 Lưu trữ đồ thị ma trận kề - Ma trận trọng số 219 6.2.2 Lưu trữ đồ thị danh sách đỉnh kề 223 6.2.3 Lưu trữ đồ thị danh sách cạnh 224 6.3 Các phép duyệt đồ thị ứng dụng 225 6.3.1 Duyệt theo chiều sâu 225 6.3.2 Duyệt theo chiều rộng 226 6.4 Một số toán đồ thị 227 6.4.1 Tìm đường ngắn ứng dụng 227 6.4.2 Tìm khung nhỏ ứng dụng 233 6.4.3 Tìm chu trình 244 6.4.4 Sắp xếp Tôpô 247 6.5 Tổng kết chương câu hỏi ôn tập 251 6.5.1 Tổng kết chương 251 6.5.2 Câu hỏi ôn tập 252 6.6 Một số câu hỏi trắc nghiệm ôn tập 252 6.7 Bài tập áp dụng 258 6.8 Bài tập có hướng dẫn: 261 Cấu trúc liệu giải thuật DANH MỤC HÌNH VẼ Hình 2.1 Minh họa thêm phần tử vào đầu danh sách 69 Hình 2.2 Chèn thêm phần tử vào cuối danh sách 70 Hình 2.3 Chèn thêm phần tử vào sau phần tử q xác định 71 Hình 2.4 Minh họa xóa phần tử đầu danh sách 72 Hình 2.5 Minh họa xóa phần tử đứng sau phần tử q xác định 73 Hình 2.6 Danh sách liên kết vòng đơn 77 Hình 2.7 Danh sách liên kết vịng đôi 78 Hình 3.1 Minh họa sử dụng danh sách liên kết cài đặt cho ngăn xếp 101 Hình 3.2 Minh họa thao tác Push để bổ sung phần tử vào Stack 102 Hình 3.3 Minh họa thao tác Pop để lấy phần tử khỏi Stack 103 Hình 3.4 Minh họa chuyển sang số 105 Hình 3.5 Minh họa hàng đợi Queue 106 Hình 3.6 Minh họa tính tổng hai đa thức 111 Hình 4.1 Hàm băm 114 Hình 4.2 Bảng băm 117 Hình 5.1 Sơ đồ tổ chức trường đại học 130 Hình 5.2 Sơ đồ tổ chức thư mục máy tính 130 Hình 5.3 Minh họa tổng quát danh sách móc nối 139 Hình 5.4 Sơ đồ cấu trúc nút 146 Hình 5.5 Kết chuyển từ tổng quát sang nhị phân 148 Hình 5.6 Minh họa tìm kiếm phần tử NPTK 152 Hình 5.7 Minh họa thêm phần tử vào NPTK 154 Hình 5.8 Minh họa xóa nút khỏi NPTK 159 Hình 5.9 Minh họa xóa nút có nhánh 160 Hình 5.10 Minh họa xóa nút có nhánh 161 Hình 5.11 Cây biểu thức (6/2 + 3) * (7 - 4) 161 Hình 5.12 Ngun tắc thực tính tốn máy tính 175 Hình 6.1 Đồ thị có hướng 215 Hình 6.2 Đồ thị vô hướng 215 Hình 6.3 Đơn đồ thị vơ hướng 216 Hình 6.4 Đa đồ thị vơ hướng 216 Cấu trúc liệu giải thuật Hình 6.5 Giả đồ thị 217 Hình 6.6 Đơn đồ thị có hướng 217 Hình 6.7 Đa đồ thị có hướng 218 Hình 6.8 Danh sách đỉnh kề lưu trữ đồ thị 224 Hình 6.9 Danh sách cạnh lưu trữ đồ thị 225 Hình 6.10 Minh họa đồ thị Euler (H1, H2, H3) 244 Hình 6.11 Minh họa đồ thị Hamilton (G1, G2, G3) 246 Hình 6.12 Đồ thị minh họa xếp Tôpô 251 Cấu trúc liệu giải thuật PHẦN TỔNG QUAN Mục đích u cầu Mơn học Cấu trúc liệu giải thuật cung cấp cho sinh viên khối lượng lớn kiến thức cấu trúc liệu phép toán cấu trúc Sau học xong mơn này, sinh viên cần phải: - Nắm vững khái niệm kiểu liệu, kiểu liệu trừu tượng, mơ hình liệu, giải thuật cấu trúc liệu - Nắm vững cài đặt mơ hình liệu, kiểu liệu trừu tượng danh sách, ngăn xếp, hàng đợi, cây, tập hợp, bảng băm, đồ thị ngơn ngữ lập trình - Vận dụng kiểu liệu trừu tượng, mơ hình liệu để giải tốn đơn giản thực tế Đối tượng sử dụng Môn học Cấu trúc liệu giải thuật dùng để giảng dạy cho sinh viên sau: - Sinh viên chuyên ngành công nghệ thông tin (môn bắt buộc) Nội dung Nội dung giáo trình gồm chương trình bày 60 tiết cho sinh viên bao gồm lý thuyết tập mà giáo viên hướng dẫn cho sinh viên lớp Nội dung giáo trình trọng trình bày cấu trúc liệu giải thuật cấu trúc liệu Chương 1: Chương tập trung trình bày khái niệm giải thuật phương pháp biểu diễn giải thuật Chương nêu phương pháp phân tích đánh giá thuật tốn, khái niệm liên quan đến việc tính tốn thời gian thực chương trình Chương 2: Trình bày mơ hình liệu danh sách, cấu trúc liệu để cài đặt danh sách, tập trung trình bày cấu trúc danh sách liên kết đơn cho Cấu trúc liệu giải thuật tốn cần duyệt danh sách Chương trình bày cài đặt chi tiết để bạn sinh viên tiếp cận thực hành Chương 3: Chương trình bày hai dạng danh sách đặc biệt Ngăn xếp Hàng đợi Chúng tơi trình bày số toán ứng dụng ngăn xếp hàng đợi thực tế Chương 4: Chương tập trung trình bày kiểu liệu trừu tượng tập hợp đặc biệt bảng băm, hàm băm Trình bày loại hàm băm bảng băm Chương 5: Chương giới thiệu kiểu liệu trừu tượng cây, khái niệm tổng quát, phép duyệt cài đặt Kế đến chúng tơi trình bày nhị phân, cách cài đặt nhị phân ứng dụng nhị phân Cuối cùng, chúng tơi trình bày tìm kiếm nhị phân ứng dụng nhị phân để lưu trữ tìm kiếm liệu Chương 6: Chương trình bày mơ hình liệu đồ thị, cách biểu diễn đồ thị Ở trình bày phép duyệt đồ thị bao gồm duyệt theo chiều rộng duyệt theo chiều sâu đề cập số toán thường gặp đồ thị tốn tìm đường ngắn nhất, tốn tìm khung tối thiểu Do hạn chế thời lượng lên lớp nên chương giới thiệu để sinh viên tham khảo thêm cách cài đặt đồ thị toán đồ thị Kiến thức tiên Để học tốt môn học Cấu trúc liệu giải thuật này, sinh viên cần có kiến thức bản: • Kiến thức kỹ lập trình Danh mục tài liệu tham khảo [1] Đinh Mạnh Tường, Cấu trúc liệu Giải thuật, Nhà xuất Khoa học Kỹ thuật, 2001 10 Cấu trúc liệu giải thuật A 30 0 0 20 10 0 0 10 15 0 0 20 0 0 15 0 0 0 0 0 0 0 0 30 20 0 0 10 10 0 0 15 0 0 20 15 0 1 0 1 0 1 1 0 1 1 0 1 0 1 B C 255 Cấu trúc liệu giải thuật D 30 0 20 10 0 30 20 10 15 0 10 10 20 0 15 15 0 20 15 Câu 5: Cây đồ thị vô hướng liên thông … A Khơng có chu trình B Khơng có đỉnh lập C Khơng có cạnh cầu D Khơng có đỉnh treo Câu 6: Giả sử T = đồ thị n đỉnh Khẳng định không tương đương với khẳng định cịn lại A T có chu trình n-1 cạnh B T liên thơng cạnh cầu C T liên thơng có n-1 cạnh D T liên thơng khơng có chu trình Câu 7: Cho G = đồ thị vô hướng liên thông n đỉnh T = gọi khung đồ thị nếu: A T liên thơng có n-1 cạnh B T liên thơng cạnh cầu; C T liên thơng khơng có chu trình H E D T liên thơng khơng có chu trình Câu 8: Ma trận lưu trữ đồ thị số cho hình vẽ 256 Cấu trúc liệu giải thuật A B C D Câu 9: Cho đồ thị G = dạng ma trận trọng số Hãy cho tập cạnh khung nhỏ xây dựng theo thuật toán Kruskal A T = {(1, 2), (1, 4), (2, 4), (2, 6), (4, 5), (6, 7)} B T = { (2, 3), (1, 3), (4, 5), (4, 6), (3, 5) } C T = {(1, 2), (1, 4), (2, 3), (2, 6), (6, 3), (6, 7)} D T={(1, 2), (1, 4), (2, 3), (4, 5), (2, 6), (6, 7)} Câu 10: Tổng phần tử hàng i, cột j ma trận kề đồ thị có hướng G = bằng: 257 Cấu trúc liệu giải thuật A Bán đỉnh bậc vào đỉnh i, bán đỉnh bậc đỉnh j B Bán đỉnh bậc đỉnh i, bán đỉnh bậc đỉnh j C Bán đỉnh bậc đỉnh i, bán đỉnh bậc vào đỉnh j D Bán đỉnh bậc vào đỉnh i, bán đỉnh bậc vào đỉnh j 6.7 Bài tập áp dụng Bài Cho đồ thị hình sau a Lập ma trận kề, b Lập ma trận liên thuộc, c Lập ma trận trọng số Bài Áp dụng thuật tốn Dijkstra tìm đường ngắn đồ thị cho a Từ đỉnh a đến đỉnh e, b Từ đỉnh a đến đỉnh i, 258 Cấu trúc liệu giải thuật c Từ đỉnh a đến đỉnh n (Mô tả chi tiết theo bảng), d Từ đỉnh a đến đỉnh s theo thuật toán Dijkstra, e Từ đỉnh a đến đỉnh k (Mô tả chi tiết theo bảng) 259 Cấu trúc liệu giải thuật Bài Dùng thuật toán Kruskal thuật tốn Prim để tìm khung nhỏ đồ thị cho Đồ thị vô hướng G lưu trữ ma trận kề sau: a b ⎡0 ⎢2 ⎢ ⎢4 ⎢ ⎢4 ⎢⎣3 3⎤ 3⎥⎥ ∞ 2⎥ ⎥; ∞ 2⎥ 2 0⎥⎦ ⎡0 ⎢14 ⎢ ⎢3 ⎢ ⎢15 ⎢28 ⎢ ⎢⎣35 14 15 11 29 11 27 29 27 24 12 28 16 11 14 28 35⎤ 24 16 ⎥⎥ 12 11⎥ ⎥ 28 14 ⎥ 13 ⎥ ⎥ 13 ⎥⎦ Đồ thị cho hình vẽ sau: 260 Cấu trúc liệu giải thuật a Bài 4: Bài tập áp dụng Áp dụng thuật tốn Floyd để tìm đường ngắn hai đỉnh đồ thị sau 6.8 Bài tập có hướng dẫn: Bài 1: Chương trình lưu trữ đồ thị dạng Ma trận trọng số 261 Cấu trúc liệu giải thuật #include #include #include #define max 20 //Khai bao CTDL Ma tran Trong so struct DoThi { int n; float C[max][max]; }; //Nhap lien tiep den nhap dinh = thi dung void nhapDoThi(DoThi &G) { int dd,dc; float ts; printf("\n Nhap so dinh cua thi:"); scanf("%d", &G.n); for(int i =1; i