Chương 1 1 LỜI NÓI ĐẦU Trước khi viết một chương trình máy tính, dù đơn giản nhất, bất cứ ai, dù ở trình độ nào cũng đều phải tư duy ít nhiều về thuật toán và cách thức tổ chức lưu trữ, quản lý các dữ liệu của chương trình Trong tổng thể kiến thức về tin học, các Giải thuật (Algorithms) cùng với các Cấu trúc dữ liệu (CTDL) và thuật toán là môn học đóng vai trò quan trong quá trình đào tạo kỹ sư các ngành công nghệ thông tin và Điện tử Viễn thông Đáp ứng nhu cầu của các bạn sinh viên nói chung và.
LỜI NĨI ĐẦU Trước viết chương trình máy tính, dù đơn giản nhất, ai, dù trình độ phải tư nhiều thuật toán cách thức tổ chức lưu trữ, quản lý liệu chương trình Trong tổng thể kiến thức tin học, Giải thuật (Algorithms) với Cấu trúc liệu (CTDL) thuật tốn mơn học đóng vai trị quan q trình đào tạo kỹ sư ngành cơng nghệ thơng tin Điện tử Viễn thông Đáp ứng nhu cầu bạn sinh viên nói chung sinh viên Trường Công Nghệ Thông Tin v T r u yề n t h ô n g - Đ i h ọ c T h i n g u yê n n ó i r i ê n g , tiến hành biên soạn giáo trình Cấu trúc liệu thuật tốn với mục đích nhằm giúp bạn sinh viên chun ngành có tài liệu hữu ích học tập, nâng cao trình độ Ngồi giáo trình cịn tài liệu hữu ích cho bạn đọc có nhu cầu tham khảo Giáo trình Cấu trúc liệu thuật tốn hình thành dựa sở cá c sách “Cấu trúc liệu thuật toán” tác giả Đinh Mạnh Tường, “Cấu trúc liệu giải thuật”, tác giả Đỗ Xuân Lôi, “ Cấu trúc liệu + giải thuật= Chương trình” N Wirth Giáo trình biên soạn dựa kinh nghiệm giảng dạy nhiều năm môn học trường Khi lập trình giải tốn, cần đến hai dạng biểu diễn liệu: biểu diễn trừu tượng biểu diễn cụ Ở giai đoạn thiết kế chương trình ta cần sử dụng biểu diễn trừu tượng liệu, tới giai đoạn cài đặt chương trình ta cần sử dụng biểu diễn cụ thể liệu Biểu diễn trừu tượng liệu xác định mơ hình liệu (MHDL), mơ hình tốn học đối tượng liệu với phép toán thực đối tượng liệu nó, ví dụ mơ hinh liệu cây, danh sách, .Khi ta sử dụng mơ hình liệu với số xác định phép tốn đó, có kiểu liệu trừu tượng (Abstract Data Typedef struct), ví dụ danh sách với hai phép tốn thêm vào lấy thực đầu danh sách lập thành kiểu liệu trừu tượng (KDLTT) ngăn xếp (Stack) Biểu diễn cụ thể liệu biểu diễn xác định cách lưu trữ vật lý liệu nhớ máy tính Biểu diễn cụ thể liệu xác định CTDL Các CTDL mô tả ngơn ngữ lập trình mà ta sử dụng Từ biểu diễn trừu tượng ta chuyển dịch thành biểu diễn cụ thể khác nhau, hay nói cách khác từ MHDL, từ KDLTT, ta chuyển dịch thành CTDL khác Chẳng hạn, ta cài đặt danh sách cấu CTDL mảng CTDL danh sách liên kết Khi cài đặt MHDL KDLTT cấu trúc liệu đó, phép tốn mơ hình thực thao tác cần thiết CTDL Vì vậy, giáo trình nói CTDL ứng với MHDL KDLTT, phương pháp trình bày sau: Đầu tiên đưa khái niệm MHDL KDLTT, sau đưa phép tốn thường gặp MHDL KDLTT, CTDL biểu diễn chúng Với CTDL sử dụng để biểu diễn MHDL KDLTT cài đặt hàm thủ tục thực phép toán cần thiết Từ cung cấp sở để bạn đọc thực thao tác phức thạp CTDL Trong giáo trình chúng tơi sử dụng ngơn ngữ lập trình Pascal để biểu diễn CTDL cài đặt phép tốn, bạn đọc dễ dàng chuyển sang ngơn ngữ lập trình khác muốn Nội dung giáo trình gồm năm chương, chương trình bày MHDL hoặc/và KDLTT nó, ngồi nội dung trình bày mơ tả trên, kết thúc chương câu hỏi thảo luận tập thực hành để bạn đọc thảo luận, thực hành, tham khảo thêm từ nhiều nguồn tài liệu khác nhằm giúp hiểu thấu lý thuyết cung cấp chương, tích cực hóa nhận thức người học thông qua nội dung cần thảo luận Nội dung chương mơ tả vắn tắt sau: Chương 1: Trình bày cách tiếp cận từ tốn đến chương trình - mơ tả q trình từ việc mơ hình hố tốn thực tế thành mơ hình tốn học đến việc lựa chọn xây dựng cấu trúc liệu, giải thuật cho toán, bước tinh chế giải thuật để đưa đến chương trình cài đặt cụ thể sử dụng ngơn ngữ lập trình Pascal Trong chương chúng tơi cịn cung cấp khái niệm CTDL thuật toán, kỹ thuật đệ quy cách giải toán, tiêu chuẩn lựa chọn CTDL phù hợp cho tốn cách để phân tích đánh giá thuật tốn Chương 2: Trình bày MHDL danh sách, CTDL tương ứng với mơ hình cấu trúc danh sách liên kết đơn, cấu trúc danh sách liên kết vòng cấu trúc danh sách liên kết kép Ngăn xếp hàng đợi trình bày chương xem hai KDLTT từ mô hình danh sách, CTDL tương ứng với Chương có nhiều cài đặt tương đối chi tiết để bạn đọc tiếp cận với lập trình có hội nâng cao khả lập trình ngơn ngữ pascal, từ chuyển dịch cài đặt sang ngơn ngữ lập trình khác, ví dụ C, Java, Chương 3: Chương giới thiệu MHDL bao gồm tổng quát, nhị phân, nhị phân tìm kiếm Với mơ hình chúng tơi trình bày nội dung cần thiết như: khái niệm, phép toán bản, phép duyệt cây, CTDL biểu diễn cây, sau chúng tơi thực việc cài đặt số phép toán mơ hình số CTDL tương ứng với nó, bạn đọc vận dụng để cài đặt phép tốn cịn lại cài đặt phép toán CTDL cịn lại mơ hình Lợi bất lợi CTDL biểu diễn bạn đọc nhận thức rõ qua chương Chương 4: Chương trình bày MHDL đồ thị Bạn đọc thấy rõ vai trò đồ thị việc giải toán ứng dụng thực tế Chương chúng tơi trình bày mang tính chất giới thiệu Bạn đọc tìm hiểu tham khảo thêm từ nhiều nguồn tài liệu khác Chương 5: Chương nói MHDL tập hợp, nội dung trình bày gồm: Định nghĩa tập hợp, phép toán tập hợp, CTDL biểu diễn tập hợp biểu diễn tập hợp vectơ bít hay danh sách liên kết, danh sách kế tiếp, Chúng lựa chọn dạng biểu diễn tập hợp véc tơ bít để cài đặt số phép tốn tập hợp, bạn đọc phải tự thảo luận cài đặt chúng dạng biểu diễn tập hợp khác Phần chương trình bày kiểu liệu trừu tượng từ điển (Dictionary) Phần cuối chương cho biết cấu trúc liệu thích hợp để biểu diễn từ điển bảng băm (Hash Table) Để đọc học giáo trình này, bạn đọc cần biết lập trình ngơn ngữ Pascal, nắm số thuật tốn xếp tìm kiếm như: xếp bọt, xếp chọn, xếp chèn, xếp trộn, số thuật tốn tìm kiếm tìm kiếm tuần tự, tìm kiếm nhị phân Mặc dù cố gắng nhiều 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 đọc để ngày hồn thiện trở thành giáo trình thực hữu ích Mọi đóng góp xin gửi qua địa chỉ: dtquy@ictu.edu.vn Thái nguyên, 05/2019 Tác giả MỤC LỤC Chương MỞ ĐẦU 1 Từ toán đên chương trình 1.2 Các khái niệm 10 1.2.1 Mơ hình liệu ( Data model ) 10 1.2.2 Khái niệm trừu tượng hóa 13 1.2.3 Kiểu liệu trừu tượng 13 1.2.4 Dữ liệu 13 1.2.5 Biểu diễn liệu máy tính 13 1.2.6 Kiểu liệu 14 1.2.7 Cấu trúc liệu (Data Structures) 16 1.2.8 Giải thuật 17 1.2.6 Mối quan hệ cấu trúc liệu giải thuật 17 1.3 Phân tích giải thuật 18 1.3.1 Sự cần thiết phải phân tích giải thuật 18 1.3.2 Thời gian thực giải thuật 19 1.3.3 Không gian giải thuật 22 1.4 Ngôn ngữ diễn đạt giải thuật 22 1.5 Đệ quy giải thuật đệ 23 1.5.1 Một số thuật ngữ 23 1.5.2 Giải thuật đệ quy thủ tục đệ quy 23 Chương MÔ HÌNH DỮ LIỆU DANH SÁCH 25 2.1 Danh sách (List) 25 2.1.1 Khái niệm danh sách 25 2.1 Các phép toán danh sách 25 2.1.3.1 Danh sách cài đặt mảng 27 2.1.3.2 Danh sách cài đặt trỏ 29 2.2.1 Định nghĩa ngăn xếp 35 2.2.2 Các phép toán ngăn xếp: 36 2.2.3 Biểu diễn ngăn xếp máy tính 36 2.2.4 Ứng dụng ngăn xếp 37 2.3 Hàng đợi (QUEUE) 38 2.3.1 Định nghĩa hàng đợi 38 2.3.2 Các phép toán hàng 38 2.3.3 Cài đặt hàng đợi 38 2.3.3.1 Cài đặt hàng đợi mảng 39 2.3.3.2 Cài đặt hàng trỏ 41 2.3.4 Một số ứng dụng cấu trúc hàng 41 Chương MÔ HÌNH DỮ LIỆU CÂY 43 3.1 Cây tổng quát 43 3.1.2 Các phép toán 43 3.1.3 Các cách thăm (duyệt) 44 3.1.4 Biểu diễn máy tính 45 3.1.4.1 Biểu diễn danh sách đỉnh 45 3.1.4.2 Biểu diễn trưởng em liền kề đỉnh .48 3.1.4.3 Biểu diễn cha đỉnh .50 3.2 Cây nhị phân (binary tree) 50 3.2.1 Định nghĩa 50 3.2.2 Duyệt nhị phân 51 3.2.3 Biểu diễn nhị phân máy tính 52 3.2.4 Các phép toán nhị phân 52 3.3 Cây tìm kiếm nhị phân (binary search tree) 54 3.3.1 Định nghĩa TKNP 54 3.3.2 Biểu diễn tìm kiếm nhị phân máy tính 55 3.3.3 Các phép toán tìm kiếm nhị phân 55 Chương MƠ HÌNH DỮ LIỆU ĐỒ THỊ 61 4.1 Định nghĩa đồ thị khái niệm 61 4.2 Các phép toán đồ thị 61 4.3 Biểu diễn đồ thị 62 4.3.1 Biểu diễn đồ thị ma trận kề 62 4.3.2 Biểu diễn đồ thị danh sách đỉnh kề 63 4.4 Các phép duyệt đồ thị (TRAVERSALS OF GRAPH) 63 4.4.1 Duyệt theo chiều sâu (depth-first search) 63 4.4.2 Duyệt theo chiều rộng (breadth-first search) 63 4.5 Một số toán ứng dụng đồ thị: 63 Chương MƠ HÌNH DỮ LIỆU TẬP HỢP 66 5.1 Khái niệm tập hợp 66 Mơ hình liệu tập hợp 66 5.3 Biểu diễn tập hợp máy tính cài đặt phép tốn tập hợp 67 5.3.1.Cài đặt tập hợp vectơ bit 67 5.3.2 Cài đặt tập hợp mảng 68 5.3.3 Cài đặt danh sách liên kết danh sách 68 5.4 Từ điển (Dictionary) 69 5.4.1 Từ điển gì? 69 5.4.2 Các phương pháp cài đặt từ điển 69 5.4.3 Cấu trúc liệu Bảng băm, cài đặt từ điển bảng băm 70 5.4.3.1 Cài đặt từ điển bảng băm mở 70 5.4.3.2 Cài đặt từ điển bảng băm đóng 72 5.4.3.3 Các phương pháp xác định hàm băm 73 Chương MỞ ĐẦU 1 Từ tốn đên chương trình Để lập trình giải tốn máy tính ta thường trải qua giai đoạn giai đoạn 1: thiết kế - nhằm xác định toán cần giải xây dựng mơ hình tốn học cho tốn Mục đích giai đoạn nhằm trả lời hai câu hỏi: Bài tốn cho u cầu làm gì? sau trả lời câu hỏi “để thực yêu cầu toán làm nào” Giai đoạn 2: Mã hóa - Sử dụng ngơn ngữ lập trình cụ thể để viết chương trình ứng với cách làm giai đoạn trước 1.1.1 Xác định & mơ hình hóa toán cần giải Khi giải toán thực tế ta phải việc xác định toán, giai đoạn cần nhiều thời gian cơng sức bỏ để thực Nó nhằm trả lời rõ ràng câu hỏi: 1) toán yêu cầu ta "phải làm cơng việc gì?"; 2) để thực cơng việc ta phải "làm nào?" Thông thường, khởi đầu, hầu hết tốn khơng đơn giản, khơng rõ ràng Để giảm bớt phức tạp toán thực tế, ta phải hình thức hóa nó, nghĩa phát biểu lại tốn thực tế thành tốn hình thức (hay cịn gọi mơ hình tốn) Có thể có nhiều tốn thực tế có mơ hình tốn Ví dụ 1: Xét tốn tơ màu đồ giới Ta cần phải tô màu cho nước đồ giới Trong nước tô màu hai nước láng giềng (cùng biên giới) phải tơ hai màu khác Hãy tìm phương án tơ màu cho số màu sử dụng Việc lựa chọn xây dựng mơ hình tốn học cho tốn diễn theo phân tích sau: Có thể xem nước đồ giới đỉnh đồ thị, hai nước láng giềng hai đỉnh ứng với nối với cạnh Bài toán lúc trở thành tốn tơ màu cho đồ thị: Mỗi đỉnh phải tơ màu, Hai đỉnh có cạnh nối phải tô hai màu khác ta cần tìm phương án tơ màu cho số màu sử dụng Mơ hình tốn học sử dụng tốn mơ hình đồ thị Ví dụ 2: Xét tốn điều khiển đèn giao thơng Cho ngã năm hình 1.1, C E đường chiều theo chiều mũi tên, đường khác hai chiều Hãy thiết kế bảng đèn hiệu điều khiển giao thông ngã năm cách hợp lý, nghĩa là: phân chia lối ngã năm thành nhóm, nhóm gồm lối đi đồng thời không xảy tai nạn giao thơng (các lối có hướng khơng cắt nhau), số lượng nhóm chia B A C D E Hình 1.1 – Ngã năm giao thơng với lỗi rẽ Việc lựa chọn, xây dựng mơ hình tốn học cho tốn diễn theo phân tích sau: Có thể xem đầu vào tốn tất lối ngã năm này, đầu tốn nhóm lối đi đồng thời mà không xảy tai nạn giao thơng, nhóm tương ứng với pha điều khiển đèn hiệu, ta phải tìm kiếm lời giải với số nhóm để giao thơng khơng bị tắc nghẽn phải chờ đợi lâu Trước hết ta nhận thấy ngã năm có 13 lối đi: AB, AC, AD, BA, BC, BD, DA, DB, DC, EA, EB, EC, ED Tất nhiên, để giải tốn ta phải tìm cách để thể mối liên quan lối Lối với lối đồng thời, lối lối đồng thời Ví dụ cặp AB EC đồng thời, AD EB khơng, hướng giao thơng cắt Ở ta dùng sơ đồ trực quan sau: tên 13 lối viết lên mặt phẳng, hai lối đồng thời xảy đụng (tức hai hướng cắt qua nhau) ta nối lại đoạn thẳng, cong, ngoằn ngo tuỳ thích Ta có sơ đồ hình 1.2 Như vậy, sơ đồ này, hai lối có cạnh nối lại với hai lối cho đồng thời AB AC AD BA BC DA DB DC EA EB EC BD ED Hình 1.2 – Đồ thị biểu diễn quan hệ giứa lối Với cách biểu diễn ta có mơ hình tốn học đồ thị (Graph), lối trở thành đỉnh đồ thị, hai lối đồng thời nối đoạn ta gọi cạnh đồ thị Bây ta phải xác định nhóm, với số nhóm nhất, nhóm gồm lối đi đồng thời, ứng với pha đèn hiệu điều khiển giao thông Giả sử rằng, ta dùng màu để tô lên đỉnh đồ thị cho: (1) Các lối cho phép đồng thời có màu: Dễ dàng nhận thấy hai đỉnh có cạnh nối khơng tơ màu ( ) Số nhóm nhất: ta phải tính toán cho số màu dùng Tóm lại, ta phải giải tốn sau: "Tơ màu cho đồ thị hình 1.2 cho: Hai đỉnh có cạnh nối với (hai cịn gọi hai đỉnh kề nhau) khơng màu Số màu dùng nhất." Trở tốn tương tự ví dụ trước Cả hai tốn trên, ban đầu khác nhau, sau phân tích để hình thức hóa chúng đưa mơ hình tốn học đồ thị, áp dụng thuật tốn tơ mầu đồ thị để giải toán Một toán thực tế thường bao gồm đối tượng liệu yêu cầu xử lý đối tượng đó, giai đoạn phân tích thiết kế, xây dựng mơ hình tốn học cho toán cần trọng đến hai vấn đề : (1) Tổ chức biểu diễn đối tượng liệu tốn mơ hình tốn học nào? mơ hình ta cịn gọi mơ hình liệu tin học ? (2) Xây dựng thao tác xử lý đối tượng mơ hình ? 1.1.2 Cài đặt chương trình cho tốn cần giải Khi cài đặt chương trình giải tốn tương ứng ta quan tâm đến hai vấn đề: 1) Biểu diễn mơ hình liệu/mơ hình tốn học tốn máy tính Ta phải chọn dạng biểu diễn để máy tính hiểu thực hiên thao tác chúng Giai đoạn gọi xây dựng cấu trúc liệu cho tốn Ta cài đặt mơ hình liệu nhiều cấu trúc liệu khác Trong cách cài đặt, số phép tốn mơ hình thực thuận lơi, phép toán khác lại khơng thuận lợi 2) Mã hóa giải thuật Với cấu trúc liệu ta cần mã hóa thao xử lý để giải yêu cầu đặt toán Ta sử dụng ngơn ngữ lập trình cụ thể (Pascal,C, ) để cài đặt kết giai đoạn 1, bước ta dùng cấu trúc liệu cung cấp ngôn ngữ, ví dụ Array, Record, để biểu diễn m h ì n h d ữ l i ệ u c ủ a b i t o n t r ê n m y t í n h , mã hóa giải thuật câu lệnh ngơn ngữ lập trình lựa chọn Tóm lược bước từ tốn đến chương trình: 1) Về mặt liệu Theo quy trình từ: Mơ hình liệu -> Kiểu liệu trừu tượng -> Cấu trúc liệu Thật vậy: Trong trình phát triển chương trình, phát triển hệ thống phần mềm lớn, ta cần đến hai dạng biểu diễn liệu: Biếu diễn trừu tượng biểu diễn cụ thể a) Trong giai đoạn xác định mơ hình hóa tốn: ta cần sử dụng dạng biểu diễn trừu tượng: xác định mơ hình liệu – mơ hình tốn học, ví dụ như: Mơ hình cây, danh sách, tập hợp, đồ thị, mơ hình ERA, …Khi ta dùng mơ hình liệu với số xác định phép tốn đó, ta có kiểu liệu trừu tượng , ví dụ: Ngăn xếp, hàng đợi, bảng băm, … => Dạng biểu diễn liệu không phụ thuộc vào ngôn ngữ lập trình cụ thể b) Trong giai đoạn cài đặt chương trình, ta cần sử dụng dạng biểu diễn cụ thể liệu: Là biểu diễn xác định cách lưu trữ vật lý liệu nhớ máy tính Biểu diễn cụ thể liệu xác định cấu trúc liệu Các cấu trúc liệu mô tả ngôn ngữ lập trình cụ thể mà ta sử dụng => Dạng biểu diễn phụ thuộc vào ngơn ngữ lập trình cụ thể Từ biểu diễn trừu tượng, ta chuyển dịch thành biểu diễn cụ thể khác nhau, hay cấu trúc liệu khác Ví dụ, ta biểu diễn danh sách mảng trỏ, tương ứng ta thu CTDL kế tiếp, CTDL danh sách liên kết đơn, đơi, vịng… 2) Về mặt xử lý liệu Theo quy trình từ: Giải thuật phi hình thức -> giải thuật giả ngơn -> Giải thuật mã hóa hồn tồn ngơn ngữ lập trình cụ thể Thật vây: từ yêu cầu xử lý toán, ta xây dựng c c giải thuật mơ hình d ữ l i ệ u đ ã x â y d ự n g Giải thuật mơ tả cách phi hình thức - nêu phương pháp giải bước giải cách tổng quát Tiếp theo ta hình thức hố giải thuật ngơn ngữ giả, chi tiết hoá dần ("mịn hoá") bước giải tổng quát (làm mịn dần), bước ta cần dùng kiểu liệu trừu tượng (MHDL KDLTT) cấu trúc lệnh điều khiển ngơn ngữ lập trình (khơng trọng đến cú pháp ngôn ngữ) , kết hợp ngôn ngữ tự nhiên để mô tả giải thuật Cuối pha cài đặt, ta tiến hành mã hóa hồn tồn giải thuật mô tả ngôn ngữ giả, sử dụng ngơn ngữ lập trình cụ thể, thao tác CTDL cụ thể 1.2 Các khái niệm 1.2.1 Mô hình liệu ( Data model ) Mơ hình liệu gì? Là mơ hình liệu sử dụng để mô tả cấu trúc logic liệu xử lý hệ thống Là mơ hình tốn học với phép tốn thực đối tượng mơ hình 10 ... ta định nghĩa cấu trúc liệu thông qua khái niệm khác CTDL MHDL/KDLTT biểu diễn máy tính, hay cấu trúc liệu kiểu liệu có cấu trúc Các tiêu chuẩn lựa chọn cấu trúc liệu liệu cho toán: - Phản ánh... Trong chương trình máy tính, giải thuật cấu trúc liệu có mối quan hệ chặt chẽ với nhau, thể qua công thức Cấu trúc liệu + Giải thuật = Chương trình Với cấu trúc liệu chọn, có giải thuật tương... cấu trúc liệu linh động mảng, ví dụ danh sách liên kết – ta đề cập đến chương Tóm lại Kiểu liệu phức/có cấu trúc, hay gọi cấu trúc liệu, kiểu liệu phần tử phân tách thành kiểu liệu đơn kiểu liệu