Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 188 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
188
Dung lượng
2,66 MB
Nội dung
ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC SƯ PHẠM PHẠM ANH PHƯƠNG (CHỦ BIÊN) NGUYỄN ĐÌNH LẦU, TRẦN VĂN HƯNG, QUÁCH HẢI THỌ GIÁO TRÌNH CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT ĐÀ NẴNG 12/2022 MỤC LỤC LỜI MỞ ĐẦU CHƯƠNG 1: TỔNG QUAN VỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1.1 CÁC KHÁI NIỆM 1.1.1 Dữ liệu 1.1.2 Cấu trúc lưu trữ 1.1.3 Lựa chọn cấu trúc liệu cho toán 1.2 GIẢI THUẬT 1.2.1 Khái niệm giải thuật 1.2.2 Các tính chất giải thuật 1.2.3 Mối quan hệ cấu trúc liệu giải thuật 1.3 NGÔN NGỮ BIỂU DIỄN GIẢI THUẬT 10 1.3.1 Ngôn ngữ tự nhiên 10 1.3.2 Giả mã 10 1.3.3 Lưu đồ 11 1.4 PHÂN TÍCH VÀ ĐÁNH GIÁ GIẢI THUẬT 13 1.4.1 Đặt vấn đề 13 1.4.2 Độ phức tạp tính tốn giải thuật 14 1.4.3 Độ phức tạp số giải thuật thông dụng 15 BÀI TẬP CHƯƠNG 15 CHƯƠNG 2: GIẢI THUẬT ĐỆ QUY 17 2.1 ĐỊNH NGHĨA ĐỆ QUY 17 2.2 CẤU TRÚC CỦA GIẢI THUẬT ĐỆ QUY 18 2.3 PHƯƠNG PHÁP XÂY DỰNG GIẢI THUẬT ĐỆ QUY 18 2.4 ƯU VÀ NHƯỢC ĐIỂM CỦA ĐỆ QUY 21 2.4.1 Ưu điểm 21 2.4.2 Nhược điểm 21 2.5 PHÂN LOẠI ĐỆ QUY 21 2.5.1 Đơn đệ quy 21 2.5.2 Đa đệ quy 22 2.5.3 Đệ quy chéo 22 2.5.4 Đệ quy chồng 23 2.5.5 Đệ quy đuôi 23 2.6 GIẢI THUẬT QUAY LUI 24 BÀI TẬP CHƯƠNG 28 CHƯƠNG 3: DANH SÁCH ĐẶC 30 3.1 KHÁI NIỆM DANH SÁCH 30 3.2 CÁC THAO TÁC TRÊN DANH SÁCH ĐẶC 30 3.2.1 Duyệt danh sách 30 3.2.2 Chèn phần tử vào danh sách 30 3.2.3 Xóa phần tử khỏi danh sách 31 3.2.4 Ưu nhược điểm dùng danh sách đặc 31 3.3 CÁC THUẬT TOÁN SẮP XẾP 33 3.3.1 Sắp xếp bọt (Bubble sort) 33 3.3.2 Sắp xếp chọn (Selection sort) 34 3.3.3 Sắp xếp chèn (Insertion Sort) 36 3.3.4 Sắp xếp nhanh (Quick Sort) 37 3.3.5.Sắp xếp trộn (Merge Sort) 41 3.3.6 Sắp xếp vun đống (Heap sort) 45 3.4 THUẬT TỐN TÌM KIẾM 48 3.4.1 Tìm kiếm 48 3.4.2 Tìm kiếm nhị phân 48 BÀI TẬP CHƯƠNG 50 CHƯƠNG 4: DANH SÁCH LIÊN KẾT 55 4.1 GIỚI THIỆU 55 4.2 DANH SÁCH LIÊN KẾT ĐƠN 56 4.2.1 Định nghĩa khai báo 56 4.2.2 Các thao tác danh sách liên kết đơn 57 4.2.3 Danh sách liên kết đơn nối vòng 67 4.3 DANH SÁCH LIÊN KẾT KÉP 73 4.3.1 Định nghĩa 73 4.3.2 Các thao tác danh sách liên kết kép 74 BÀI TẬP CHƯƠNG 78 CHƯƠNG 5: DANH SÁCH HẠN CHẾ 83 5.1 ĐẶT VẤN ĐỀ 83 5.2 NGĂN XẾP 83 5.2.1 Định nghĩa ngăn xếp 83 5.2.2 Các thao tác ngăn xếp 84 5.2.3 Cài đặt ngăn xếp 84 5.2.4 Ứng dụng ngăn xếp 87 5.3 HÀNG ĐỢI 92 5.3.1 Định nghĩa 92 5.3.2 Các phép toán hàng đợi 92 5.3.3 Cài đặt hàng đợi 92 5.3.4 Ứng dụng hàng đợi 97 BÀI TẬP CHƯƠNG 97 CHƯƠNG 6: ĐỒ THỊ 100 6.1 CÁC KHÁI NIỆM CƠ BẢN 100 6.1.1 Các định nghĩa 100 6.1.2 Một số dạng đồ thị đặc biệt 102 6.1.3 Đường đi, chu trình đồ thị liên thơng 103 6.2 BIỂU DIỄN ĐỒ THỊ 104 6.2.1 Ma trận kề, ma trận trọng số 104 6.2.2 Danh sách kề 106 6.3 CÁC PHƯƠNG PHÁP DUYỆT ĐỒ THỊ 107 6.3.1 Duyệt theo chiều sâu 107 6.3.2 Duyệt theo chiều rộng 108 6.3.3 Tìm đường kiểm tra tính liên thơng đồ thị 110 6.4 MỘT SỐ BÀI TOÁN TỐI ƯU TRÊN ĐỒ THỊ .111 6.4.1 Bài tốn tìm đường ngắn 111 6.4.2 Bài tốn tìm khung nhỏ 115 BÀI TẬP CHƯƠNG .120 CHƯƠNG 7: CÂY 123 7.1 GIỚI THIỆU .123 7.2 ĐỊNH NGHĨA VÀ MỘT SỐ KHÁI NIỆM 124 7.2.1 Định nghĩa 124 7.2.2 Các khái niệm 125 7.3 CÂY NHỊ PHÂN 126 7.3.1 Định nghĩa 126 7.3.2 Các khái niệm bổ sung 126 7.3.3 Tổ chức lưu trữ nhị phân 128 7.3.4 Các phép duyệt nhị phân 130 7.4 CÂY BIỂU THỨC 131 7.5 CÂY TÌM KIẾM NHỊ PHÂN 135 7.5.1 Định nghĩa 135 7.5.2 Các thao tác BST 136 7.6 CÂY TÌM KIẾM NHỊ PHÂN CÂN BẰNG 139 7.6.1 Định nghĩa 139 7.6.2 Thuật toán cân đơn giản 140 7.6.3 Các phép xoay để cân BST .142 7.7 CÂY AVL 145 7.7.1 Chèn nút vào AVL 146 7.7.2 Xóa nút khỏi AVL 147 BÀI TẬP CHƯƠNG .147 CHƯƠNG 8: BẢNG BĂM 151 8.1 GIỚI THIỆU .151 8.2 HÀM BĂM .151 8.2.1 Hàm băm chia 153 8.2.2 Hàm băm xếp 154 8.2.3 Các hàm băm khác 155 8.3 XỬ LÝ VA CHẠM 155 8.3.1 Xử lý va chạm địa mở 156 8.3.2 Các yếu tố ảnh hưởng đến hiệu suất tìm kiếm .156 8.3.3 Xử lý va chạm Phương pháp chuỗi .157 8.4 XÓA PHẦN TỬ TRONG BẢNG BĂM 157 BÀI TẬP CHƯƠNG .158 PHỤ LỤC A: CÀI ĐẶT CÁC THAO TÁC TRÊN DANH SÁCH LIÊN KẾT .161 A1 DANH SÁCH LIÊN KẾT ĐƠN .161 A2 DANH SÁCH LIÊN KẾT ĐƠN NỐI VÒNG 165 A3 DANH SÁCH LIÊN KẾT KÉP 169 PHỤ LỤC B: CÀI ĐẶT STACK 174 B1 CÀI ĐẶT STACK BẰNG DANH SÁCH LIÊN KẾT .174 B2 TÍNH GIÁ TRỊ BIỂU THỨC SỐ HỌC 176 PHỤ LỤC C CÀI ĐẶT HÀNG ĐỢI 181 C1 CÀI ĐẶT HÀNG ĐỢI BẰNG MẢNG 181 C2 CÀI ĐẶT HÀNG ĐỢI BẰNG DANH SÁCH LIÊN KẾT ĐƠN .183 C3 CÀI ĐẶT HÀNG ĐỢI BẰNG DANH SÁCH LIÊN KẾT KÉP 185 TÀI LIỆU THAM KHẢO .188 Giáo trình Cấu trúc liệu giải thuật LỜI MỞ ĐẦU Theo khung chương trình đào tạo ngành Cơng nghệ Thông tin hệ Đại học Cao đẳng, Cấu trúc liệu giải thuật khối kiến thức sở ngành, hỗ trợ nâng cao kỹ lập trình cho người học Giáo trình trang bị cho bạn đọc nguyên lý thiết kế cấu trúc liệu với phép toán (thao tác) cấu trúc liệu đó: danh sách đặc (các thuật tốn tìm kiếm, xếp,…); danh sách liên kết (với thao tác: khởi tạo, bổ sung, xóa, duyệt,…); danh sách hạn chế: ngăn xếp, hàng đợi (với thao tác: khởi tạo, push, pop, ); đồ thị (các phép duyệt đồ thị, thuật toán tối ưu đồ thị); nhị phân, tìm kiếm nhị phân (với thao tác: khởi tạo, duyệt, bổ sung, xóa nút…); bảng băm Nội dung giáo trình chia thành chương, đầu chương có tóm tắt chương để bạn đọc nắm khái quát nội dung chương, sau nội dung chương trình bày ngắn gọn từ kiến thức cách tổ chức cấu trúc liệu đến xây dựng giải thuật cài đặt mã lệnh Cuối chương có hệ thống tập thực hành từ dễ đến khó, tập khó có gợi ý cách giải Các mã nguồn giáo trình viết theo phong cách hướng đối tượng, tương thích với trình biên dịch Dev C++ 5.X, công cụ hỗ trợ lập trình gọn nhẹ, biên dịch hai hệ điều hành Windows lẫn Linux sử dụng phổ biến việc học tập giảng dạy trường học kỳ thi Olympic Tin học sinh viên ACM/ICPC Quốc tế Chúng cố gắng đúc kết để biên soạn sách Giáo trình Cấu trúc liệu giải thuật cách đọng, súc tích nhằm đáp ứng nhu cầu học tập nghiên cứu học sinh, sinh viên bạn đọc quan tâm đến lĩnh vực lập trình, giúp bạn đọc có tài liệu tham khảo tốt tìm hiểu sâu lĩnh vực lập trình Chân thành cảm ơn đồng nghiệp trường Đại học Sư phạm - Đại học Đà Nẵng, Đại học Bách Khoa - Đại học Đà Nẵng, Đại học Công nghệ Thông tin Truyền thông ViệtHàn, Đại học Duy Tân, Đại học Khoa học - Đại học Huế giúp đỡ, đóng góp nhiều ý kiến quý báu để chúng tơi hồn thiện nội dung giáo trình Nhóm tác giả hy vọng sớm nhận ý kiến đóng góp, phê bình bạn đọc nội dung, chất lượng hình thức trình bày để giáo trình ngày hồn thiện Giáo trình Cấu trúc liệu giải thuật Đà Nẵng, tháng 12 năm 2022 Thay mặt nhóm tác giả Phạm Anh Phương Giáo trình Cấu trúc liệu giải thuật CHƯƠNG 1: TỔNG QUAN VỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Tóm tắt chương ▪ Khái niệm giải thuật tính chất giải thuật ▪ Mối liên hệ cấu trúc liệu giải thuật ▪ Ngôn ngữ biểu diễn giải thuật ▪ Độ phức tạp tính tốn giải thuật 1.1 CÁC KHÁI NIỆM 1.1.1 Dữ liệu Trong máy tính, liệu (data) thơng tin mã hóa sang định dạng khác thuận tiện để xử lý máy tính Đối với khoa học máy tính ngày phương tiện truyền thông, liệu thông tin chuyển đổi thành dạng số nhị phân 1.1.2 Cấu trúc lưu trữ Cách biểu diễn cấu trúc liệu (data structure) nhớ máy tính gọi cấu trúc lưu trữ Có thể có nhiều cấu trúc lưu trữ khác cho cấu trúc liệu Chẳng hạn cấu trúc liệu kiểu danh sách lưu trữ liệu vùng nhớ liên tiếp (mảng) lưu trữ vùng nhớ rời (danh sách liên kết) Có nhiều cấu trúc liệu khác biểu diễn cấu trúc lưu trữ Chẳng hạn cấu trúc chuỗi ký tự, cấu trúc mảng lưu trữ ô nhớ liên tiếp 1.1.3 Lựa chọn cấu trúc liệu cho toán Lựa chọn cấu trúc liệu thích hợp để tổ chức liệu vào sở xác lập giải thuật nhằm đạt kết mong muốn khâu quan trọng Việc chọn cấu trúc liệu phải xét tới phép toán tác động lên cấu trúc liệu Ngược lại xét đến phép tốn, cần phải ý đến phép tốn tác động cấu trúc liệu nào, có phép tốn hữu hiệu cấu trúc liệu không hữu hiệu với cấu trúc liệu khác Giáo trình Cấu trúc liệu giải thuật 1.2 GIẢI THUẬT 1.2.1 Khái niệm giải thuật Giải thuật hay thuật toán (algorithrm) dùng để phương pháp hay cách thức giải vấn đề Giải thuật dãy câu lệnh chặt chẽ rõ ràng, xác định trình tự thao tác đối tượng (input) cho sau số hữu hạn bước thực đạt kết mong muốn (output) Theo Donald Knuth viết The Art of Computer Programming, “Giải thuật thủ tục hữu hạn, xác định hiệu với số đầu vào (input) đầu (output)” Có nhiều giải thuật khác cho tốn Ví dụ, tính tổng S = + + … + n Cách 1: sử dụng kỹ thuật cộng dồn - Gán S = 0; - Cho biến i chạy từ đến n: S = S + i; Cách 2: Sử dụng công thức cấp số cộng công bội 1: S = n (n + 1)/2; 1.2.2 Các tính chất giải thuật Các giải thuật có số tính chất chung, nắm rõ tính chất giải thuật thuận lợi phân tích thiết kế giải thuật Dữ liệu vào (input) Mỗi tốn có giả thiết với vài đại lượng đầu vào xác định mà ta thường gọi liệu vào Dữ liệu (output) Thuật toán xử lý liệu đầu vào thu số đại lượng đầu xác định Các đại lượng đầu nghiệm hay kết tốn Tính đắn u cầu bắt buộc giải thuật tính đắn, với liệu đầu vào cho trước, sau số hữu hạn bước thực dừng cho kết tốn Tính xác định Giáo trình Cấu trúc liệu giải thuật Tính xác định địi hỏi bước giải thuật, thao tác phải rõ ràng, không gây nhập nhằng, lẫn lộn Nói khác đi, điều kiện, hai xử lý (người máy) thực bước giải thuật phải cho kết Hơn nữa, xử lý thuật toán không cần phải hiểu ý nghĩa bước thao tác Tính hữu hạn (tính dừng) Với liệu đầu vào xác định, giải thuật phải dừng sau số hữu hạn bước thực cho kết đầu Tính phổ dụng Giải thuật xây dựng không để giải toán riêng lẻ mà phải giải lớp tốn có cấu trúc với liệu cụ thể khác luôn dẫn đến kết mong muốn Tính hiệu Tính hiệu đánh giá dựa số tiêu chuẩn định khối lượng tính tốn, thời gian khơng gian thực giải thuật 1.2.3 Mối quan hệ cấu trúc liệu giải thuật Khi giải tốn máy tính, ta thường quan tâm đến việc thiết kế giải thuật Giải thuật đặc trưng cho cách xử lý, thường liên quan đến đối tượng để xử lý, tức liệu đối tượng Cách thể liệu theo khn dạng để lưu trữ xử lý hiệu máy tính gọi cấu trúc liệu Theo cách tiếp cận lập trình có cấu trúc, Niklaus Wirth đưa công thức thể mối liên hệ cấu trúc liệu giải thuật sau: GIẢI THUẬT + CẤU TRÚC DỮ LIỆU = CHƯƠNG TRÌNH (Algorithms + Data Structures = Programs) Khi cấu trúc liệu toán thay đổi, giải thuật phải thay đổi theo cho phù hợp với cách thức tổ chức liệu Ngược lại trình xây dựng, hoàn thiện giải thuật gợi mở cho người lập trình cách tổ chức liệu cho phù hợp với giải thuật tiết kiệm tài nguyên hệ thống Giáo trình Cấu trúc liệu giải thuật Q trình giải tốn máy tính phải ý đến mối liên hệ mật thiết giải thuật cấu trúc liệu Vì tiến hành nghiên cứu cấu trúc liệu cho toán phải đồng thời phải xác lập giải thuật tương ứng cho cấu trúc liệu 1.3 NGƠN NGỮ BIỂU DIỄN GIẢI THUẬT Khi thiết kế giải thuật, cần phải trình bày giải thuật để kiểm tra giải thuật đáp ứng yêu cầu chưa (tính đắn, tính phổ dụng, tính hữu hạn ) Qua đó, người đọc hiểu giải thuật trình bày Có nhiều cách thức khác để biểu diễn giải thuật, cụ thể: - Ngôn ngữ tự nhiên (Natural language) - Giả mã (Pseudo-code) - Lưu đồ (Flowchart) 1.3.1 Ngôn ngữ tự nhiên Để biểu diễn giải thuật theo ngôn ngữ tự nhiên, sử dụng ngơn ngữ đời thường để liệt kê bước thuật tốn Ví dụ 1.1: Tìm số lớn ba số a, b, c max(a,b,c) Bước 1: Gán m = a; Bước 2: Nếu b > m, gán m = b; Bước 3: Nếu c > m, gán m = c; Bước 4: Kết quả: max(a,b,c) = m; 1.3.2 Giả mã Khi mô tả giải thuật mã giả, ta vay mượn cú pháp ngơn ngữ lập trình để thể giải thuật Dùng mã giả vừa tận dụng khái niệm ngơn ngữ lập trình, vừa giúp người cài đặt dễ dàng nắm bắt nội dung giải thuật Tất nhiên, mã giả dùng phần ngôn ngữ tự nhiên, vay mượn cú pháp khái niệm ngôn ngữ lập trình chắn mã giả phụ thuộc vào ngơn ngữ lập trình Ví dụ 1.2: Tìm số lớn ba số a, b, c 10 Giáo trình Cấu trúc liệu giải thuật PHỤ LỤC B: CÀI ĐẶT STACK B1 CÀI ĐẶT STACK BẰNG DANH SÁCH LIÊN KẾT #include #include using namespace std; class Stack { struct NODE { int Data; NODE *Next; }; NODE *top; public: Stack() { top = NULL; } void Push(int x) { //B1: Tao nut moi p chua x NODE *p = new(NODE); p->Data = x; //B2: Chen p vao dau danh sach p->Next = top; //1 top = p; //2 } int Pop() { 174 Giáo trình Cấu trúc liệu giải thuật NODE *p = top; top = p->Next; int x = p->Data; delete p; return x; } bool isEmpty() { return top==NULL; } }; void Bin(int n) { //B1: Khoi tao stack Stack S; //B2: Dua cac so du n%2 vao stack while(n>0) { S.Push(n%2); n=n/2; } //B3: Lay cac phan tu stack in man hinh while(!S.isEmpty()) { cout