Giáo trình cấu trúc dữ liệu và giải thuật ĐH Đà Lạt
TRƯỜNG ĐẠI HỌC ĐÀ LẠT KHOA TOÁN - TIN HỌC TRƯƠNG CHÍ TÍN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (Giáo Trình) Lưu hành nội -Đà Lạt 2008 LỜI MỞ ĐẦU Giáo trình nhằm cung cấp cho sinh viên kiến thức cấu trúc liệu sở có cấu trúc tuyến tính tĩnh, động (danh sách liên kết), cấu trúc giải thuật liên quan đến chúng xếp, tìm kiếm nhớ trong, so sánh độ phức tạp giải thuật Để nắm bắt kiến thức trình bày học phần này, sinh viên cần nắm kiến thức tin học đại cương, nhập môn lập trình Ngơn ngữ lập trình chọn để minh họa kiến thức C++ Các kiến thức tạo điều kiện cho học viên tiếp tục dễ dàng nắm bắt kiến thức học phần tin học sau như: cấu trúc liệu giải thuật nâng cao, phân tích thiết kế giải thuật, đồ hoạ, hệ điều hành, trí tuệ nhân tạo, Nội dung giáo trình gồm chương: - Chương 1: Giới thiệu khái niệm ban đầu mối liên hệ mật thiết cấu trúc liệu giải thuật, kiểu liệu, thiết kế phân tích giải thuật, độ phức tạp giải thuật, - Chương 2: Giới thiệu phương pháp tìm kiếm xếp kiểu liệu tuyến tính mảng Thơng qua đó, trình bày số ý tưởng kỹ thuật nhằm cải tiến giải thuật - Chương 3: Trình bày kiểu liệu trỏ Trên sở đó, trình bày kiểu liệu động tuyến tính có nhiều ứng dụng tin học kiểu danh sách liên kết khác nhau, ngăn xếp, hàng đợi, số ứng dụng chúng - Chương 4: Giới thiệu loại cấu trúc liệu động khác thao tác nhị phân, nhị phân tìm kiếm, cân AVL Nhằm mục đích dành thời gian nhiều cho sinh viên để làm tập lớn, nên số phần tác giả trình bày chi tiết dạng cài đặt biến thể khác cho giải thuật Các phần thứ yếu phức tạp in cỡ chữ nhỏ dành cho sinh viên đọc thêm Chắn chắn giáo trình cịn nhiều khiếm khuyết, tác giả mong muốn nhận biết ơn ý kiến q báu đóng góp đồng nghiệp bạn đọc để giáo trình hoàn thiện mặt nội dung hình thức lần tái sau Đà lạt, 04/2008 Tác giả MỤC LỤC Chương I GIỚI THIỆU CẤU TRÚC DỮ LIỆU, PHÂN TÍCH GIẢI THUẬT I.1 Quan hệ cấu trúc liệu giải thuật, kiểu liệu I.1.1 Biểu diễn liệu I.1.2 Quan hệ cấu trúc liệu giải thuật, kiểu liệu I.1 I.1.3 Các bước để giải tốn máy tính I.2 Thiết kế phân tích giải thuật I.2.1 Thiết kế giải thuật theo phương pháp Top-Down I.2.2 Các chiến lược khác để thiết kế giải thuật I.2.3 Phân tích giải thuật độ phức tạp giải thuật I.2.4 Qui ước ngôn ngữ mã giả Trang I.1 I.1 I.2 I.4 I.4 I.5 I.5 I.9 Chương II TÌM KIẾM VÀ SẮP XẾP TRONG II.1 Giới thiệu xếp tìm kiếm II.1.1 Sắp xếp a Định nghĩa xếp b Phân loại phương pháp xếp c Vài qui uớc kiểu liệu xét giải thuật xếp II.1.2 Tìm kiếm a Định nghĩa phép tìm kiếm b Phân loại phương pháp tìm kiếm II.2 Phương pháp tìm kiếm II.2.1 Phương pháp tìm kiếm tuyến tính a Dãy chưa b Dãy II.2.2 Phương pháp tìm kiếm nhị phân II.3 Phương pháp xếp II.7 II.3.1 Phương pháp xếp chọn đơn giản II.3.2 Phương pháp xếp chèn đơn giản II.3.3 Phương pháp xếp đổi chỗ đơn giản II.3.4 Phương pháp xếp đổi chỗ cải tiến (Shake Sort) II.3.5 Phương pháp xếp chèn cải tiến (Shell Sort) II.3.6 Phương pháp xếp phân hoạch (Quick Sort) II.3.7 Phương pháp xếp có thứ tự (HeapSort) II.3.8 Phương pháp xếp trộn (Merge Sort) II.1 II.1 II.1 II.1 II.1 II.3 II.3 II.3 II.3 II.3 II.3 II.5 II.6 II.8 II.9 II.10 II.12 II.14 II.16 II.19 II.25 II.3.9 Phương pháp xếp dựa số (Radix Sort) II.3.10 So sánh phương pháp xếp II.28 II.31 Trang Chương III CẤU TRÚC DANH SÁCH LIÊN KẾT III.1 Giới thiệu đối tượng liệu trỏ III.1 III.1.1 So sánh cấu trúc liệu tĩnh cấu trúc liệu động III.1 III.1.2 Kiểu liệu trỏ III.1 a Định nghĩa III.1 b Khai báo III.2 c Các thao tác kiểu liệu trỏ III.3 III.1.3 Biến động III.4 a Đặc trưng biến động III.4 b Truy xuất biến động III.4 c Hai thao tác biến động III.5 III.2 Danh sách liên kết (DSLK) III.7 III.2.1 Định nghĩa danh sách III.7 III.2.2 Các cách tổ chức danh sách III.7 III.8 III.3 DSLK đơn III.3.1 Tổ chức DSLK đơn, thao tác bản, tìm kiếm xếp kiểu DSLK đơn III.8 a Tổ chức DSLK đơn (khơng có nút câm) III.8 b Các thao tác kiểu DSLK đơn III.9 c Sắp xếp kiểu DSLK đơn: xếp chèn, QuickSort, MergeSort, RadixSort III.17 III.3.2 Vài ứng dụng DSLK đơn III.24 III.3.2.1 Ngăn xếp: định nghĩa, cài đặt, phép toán ứng dụng ngăn xếp III.24 III.3.2.2 Hàng đợi: định nghĩa, cài đặt, phép toán ứng dụng hàng đợi III.31 III.4 Một số kiểu DSLK khác III.34 III.4.1 DSLK đơn có nút câm III.34 III.4.2 DSLK vịng III.37 III.4.3 DSLK đối xứng III.38 a Cấu trúc liệu biểu diễn DSLK đối xứng III.39 b Các thao tác kiểu DSLK đối xứng III.39 c Ứng dụng DSLK đối xứng: hàng đợi hai đầu III.47 III.4.4 DS đa liên kết III.48 III.4.5 Một số ứng dụng khác DSLK III.51 a DS có thứ tự DS tổ chức lại III.51 III.53 b Biểu diễn tập hợp DSLK c Biểu diễn đa thức rời rạc DSLK III.54 d Biểu diễn ma trận thưa nhờ DSLK III.56 e Sắp xếp tôpô III.57 Trang Chương IV CẤU TRÚC CÂY IV.1 Định nghĩa khái niệm IV.1.1 Định nghĩa IV.1.2 Các khái niệm khác IV.2 Cây nhị phân IV.2.1 Định nghĩa IV.2.2 Vài tính chất nhị phân IV.2.3 Biểu diễn nhị phân IV.2.4 Duyệt nhị phân IV.2.5 Một cách biểu diễn khác nhị phân IV.2.6 Biểu diễn n - phân nhị phân IV.2.7 Xây dựng nhị phân cân hoàn toàn IV.3 Cây nhị phân tìm kiếm IV.3.1 Định nghĩa nhị phân tìm kiếm IV.3.2 Tìm kiếm phần tử BST IV.3.3 Chèn phần tử vào BST, xây dựng BST IV.3.4 Phương pháp xếp BST IV.3.5 Xóa phần tử khỏi BST, hủy nhị phân IV.4 Cây nhị phân tìm kiếm cân IV.4.1 Định nghĩa IV.4.2 Chiều cao cân IV.4.3 Chỉ số cân việc cân lại AVL IV.4.4 Chèn phần tử vào AVL IV.4.5 Xóa phần tử khỏi AVL IV.1 IV.1 IV.1 IV.3 IV.3 IV.3 IV.3 IV.4 IV.7 IV.8 IV.8 IV.9 IV.9 IV.10 IV.11 IV.13 IV.13 IV.16 IV.17 IV.17 IV.18 IV.24 IV.25 Bài tập BT.1 BT.1 BT.4 BT.6 BT.11 Bài tập chương I Bài tập chương II Bài tập chương III Bài tập chương IV Tài liệu tham khảo Chương I GIỚI THIỆU CẤU TRÚC DỮ LIỆU VÀ PHÂN TÍCH GIẢI THUẬT I.1 Quan hệ cấu trúc liệu giải thuật, kiểu liệu I.1.1 Biểu diễn liệu Một mục tiêu quan trọng tin học nhằm giải tự động toán giới thực máy tính điện tử Các thơng tin tốn cần giải máy tính ln mã hố dạng nhị phân Các thơng tin gồm liệu thao tác liệu Việc biểu diễn liệu dạng nhị phân bất tiện cho người xử lý toán, đặc biệt toán lớn phức tạp Chính lý đó, ngơn ngữ lập trình bậc cao cung cấp sẵn cách biểu diễn liệu trừu tượng đơn giản có cấu trúc, nhằm giúp người lập trình khơng phải nhiều thời gian công sức thực thường xuyên lặp lại thao tác sơ cấp nặng nề kiểu liệu nhị phân mức thấp Tính trừu tượng liệu thể chỗ khơng q trọng đến đặc điểm ý nghĩa riêng đối tượng cụ thể mà rút phản ánh tính chất chung mà đối tượng thuộc lớp có I.1.2 Quan hệ cấu trúc liệu giải thuật, kiểu liệu Dựa vào chất chung nhóm liệu, đối tượng liệu phân thành lớp Mỗi lớp liệu thể qua kiểu liệu Một kiểu liệu T tập hợp đó, phần tử tập gọi thể kiểu Ta biết giải thuật (hay giải thuật) dãy câu lệnh rõ ràng, xác định trình tự thao tác số đối tượng (input) cho sau số hữu hạn bước thực (chú ý đến tính khả thi thời gian), ta đạt kết (output) mong muốn Giải thuật phản ánh phép xử lý, đối tượng để xử lý giải thuật liệu: liệu (input) đưa vào, liệu trung gian kết qủa (output) cuối Đối với lớp liệu nào, để ý kỹ, ta thấy ln tồn thao tác mật thiết gắn liền với đối tượng liệu kiểu Khi cách biểu diễn liệu thay đổi thao tác gắn liền với chúng thay đổi theo Vì khơng nhiều trường hợp việc xử lý gượng ép, thiếu tự Giới thiệu cấu trúc liệu phân tích giải thuật I.2 nhiên, khó hiểu, phức tạp khơng cần thiết chương trình hiệu quả, lãng phí tài ngun máy tính (CPU nhớ) Chẳng hạn, chuỗi ký tự, ta có hai cách biểu diễn chúng thể ngôn ngữ lập trình Pascal C Với cách biểu diễn, ta có cách xây dựng thao tác tương ứng chúng khác Một ví dụ khác, thấy rõ chương tiếp theo, dãy phần tử liệu loại, ta lưu trữ chúng hai cách: lưu mảng (tĩnh, động) hay lưu trữ danh sách liên kết động Khi đó, thao tác chúng chèn, xóa, xếp thực theo cách thức khác có hiệu khác Do đó, nói đến kiểu liệu T, ta thường ý đến hai đặc trưng quan trọng liên hệ mật thiết với nhau: - tập V giá trị thuộc kiểu, tập giá trị hợp lệ mà đối tượng kiểu T nhận lưu trữ; - tập O phép toán (hay thao tác xử lý) xác định thực đối tượng liệu kiểu Người ta thường viết: T = Trong ngơn ngữ lập trình cấp cao cụ thể, người ta thường xây dựng sẵn số kiểu liệu đơn giản hay sơ cấp xác định, chẳng hạn với C++, ta có kiểu liệu: số (nguyên, thực), ký tự, lôgic Với kiểu số nguyên, phép toán thường gặp là: phép toán số học +, -, *, / (chia nguyên), % (mod, lấy phần dư) phép toán so sánh như: ==, !=, ≥, ≤, >, < Với kiểu số thực, phép toán thường gặp là: phép toán số học +, -, *, /, phép toán so sánh như: ==, !=, ≥, ≤, >, < Với kiểu lơgic, phép tốn thường gặp là: ! (not), && (and), || (or) Với kiểu ký tự, phép toán thường gặp là: phép toán ép kiểu phép toán so sánh như: ==, !=, ≥, ≤, >, Data = q->Data; p = q; q = q->Rchild; return 2; } } * Nhận xét: - Thao tác thêm nút có độ phức tạp O(1) - Thao tác huỷ nút có độ phức tạp O(h) - Với cân bằng, trung bình: lần thêm vào cần lần cân lại, lần hủy cần lần cân lại - Việc hủy nút phải cân dây chuyền nút từ gốc đến phần tử bị hủy, thêm vào nút cần lần cân cục - Độ dài đường tìm kiếm trung bình AVL gần cân hoàn toàn (log2 n), việc cân lại đơn giản nhiều - Một cân AVL không cao 45% cân hoàn toàn tương ứng BÀI TẬP “CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1” Mục đích tập: - Kiểm tra, củng cố việc hiểu cấu trúc liệu thuật tốn có liên quan - Rèn luyện kỹ lập trình vận dụng lý thuyết vào việc chọn lựa cấu trúc liệu thuật tốn phù hợp có liên quan cho toán cụ thể - Phát triển tổng hợp kết lý thuyết nhằm chuẩn bị cho học viên làm quen với q trình giải hồn chỉnh tốn khơng tầm thường Các tập có đánh dấu (*) tập khó cần nhiều thời gian để thực dành cho học viên giỏi Có thể kết hợp nhiều tập (*) có liên quan bổ sung thêm ứng dụng thực tế để hình thành tiểu luận mơn học Phần in đậm có gạch chân u cầu tối thiểu học viên cần thực thực hành Bài tập chương I (Giới thiệu cấu trúc liệu, phân tích thuật tốn) (Kiểu liệu có cấu trúc) 1) Giả sử quy tắc tổ chức quản lý nhân viên cơng ty sau: • Thông tin nhân viên bao gồm lý lịch bảng chấm công: * Lý lịch nhân viên: - Mã nhân viên - Tên nhân viên - Tình trạng gia đình - Số - Trình độ văn hố - Lương : chuỗi 10 ký tự : chuỗi 30 ký tự : ký tự (M = Married, S = Single) : số nguyên ≤ 20 : chuỗi ký tự (C1 = cấp 1,C2=cấp 2,C3=cấp 3; DH = đại học, CH = cao học, TS = tiến sĩ) : số ≤ 000 000 * Chấm cơng nhân viên: - Số ngày nghỉ có phép tháng : số ≤ 28 - Số ngày nghỉ không phép tháng : số ≤ 28 - Số ngày làm thêm tháng : số ≤ 28 - Kết công việc : chuỗi ký tự (T = tốt, TB = trung bình, K = Kém) - Lương thực lĩnh tháng : số ≤ 000 000 Bài tập Cấu trúc liệu Thuật tóan BT.2 • Quy tắc tính lương: Lương thực lĩnh = Lương + Phụ trội Trong nếu: - số > : Phụ trội = +5% Lương - trình độ văn hố = CH : Phụ trội = +10% Lương - làm thêm : Phụ trội = +4% Lương / ngày - nghỉ không phép : Phụ trội = -5% Lương / ngày • Các chức yêu cầu: - Cập nhật lý lịch, bảng chấm công cho nhân viên (thêm, xóa, sửa hay mẫu tin thoả mãn tính chất đó) - Xem bảng lương hàng tháng - Khai thác (chẳng hạn tìm) thông tin nhân viên Hãy chọn cấu trúc liệu thích hợp (và giải thích sao?) để biểu diễn thơng tin cài đặt chương trình theo chức mô tả Biết số nhân viên tối đa 50 người, ý thông tin tĩnh “động” hay thay đổi hệ thông tin khác 2) Viết chương trình cài đặt chuỗi ký tự theo hai cách (giả sử kiểu chuỗi chưa có sẵn ngơn ngữ lập trình bạn dùng) sau: a phần tử đầu số ký tự chuỗi; b chuỗi kết thúc ký tự có mã ASCII Sau viết lại thao tác chuỗi (tính chiều dài chuỗi, nối, chép phần chuỗi, chặt ngắn chuỗi, kiểm tra chuỗi con, ) (Độ phức tạp thuật toán) 3) Hãy nêu thuật tốn mà độ phức tạp tính tốn là: O(1), O(n), O(n2) 4) Hãy xác định mục đích thuật toán sau (xác định phép toán đặc trưng nó) tính độ phức tạp tính tốn trường hợp xấu nhất, tốt nhất: a) Sum = 0; for (i = 1; i > x; // Nhập số x; Sum = Sum + x; } b) for (i = 1; i