(NB)Giáo trình Cấu trúc dữ liệu và giải thuật với mục tiêu giúp các bạn mô tả được các khái niệm về kiểu dữ liệu trừu tương, kiểu dữ liệu, cấu trúc dữ liệu và giải thuật. Biết được các phép toán cơ bản tương ứng với các cấu trúc dữ liệu và các giải thuật. Biết cách tổ chức dữ liệu hợp lý, khoa học cho một chương trình đơn giản.
BỘ LAO ĐỘNG -THƯƠNG BINH VÀ XÃ HỘI TRƯỜNG CAO ĐẲNG NGHỀ KỸ THUẬT CÔNG NGHỆ -š› & š› - GIÁO TRÌNH MƠN HỌC: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT NGHỀ: CƠNG NGHỆ THƠNG TIN TRÌNH ĐỘ: CAO ĐẲNG Ban hành kèm theo Quyết định số: 245/QĐ-CĐNKTCN ngày 23 tháng 10 năm 2020 Hiệu trưởng Trường Cao đẳng nghề Kỹ thuật Công nghệ Hà Nội, năm 2021 (Lưu hành nội bộ) TUYÊN BỐ BẢN QUYỀN: Tài liệu thuộc loại sách giáo trình nên nguồn thơng tin phép dùng ngun trích dùng cho mục đích đào tạo tham khảo Mọi mục đích khác mang tính lệch lạc sử dụng với mục đích kinh doanh thiếu lành mạnh bị nghiêm cấm MÃ TÀI LIỆU: MHCNTT 08 LỜI GIỚI THIỆU Kiến thức môn học Cấu trúc liệu giải thuật tản người muốn tìm hiểu sâu Công nghệ thông tin đặc biệt việc lập trình để giải tốn máy tính điện tử Các cấu trúc liệu giải thuật xem yếu tố quan trọng lập trình, câu nói tiếng Niklaus Wirth: Chương trình = Cấu trúc liệu + Giải thuật (Programs = Data Structures + Algorithms) Nắm vững cấu trúc liệu giải thuật sở để sinh viên tiếp cận với việc thiết kế xây dựng phần mềm sử dụng cơng cụ lập trình đại Cấu trúc liệu xem phương pháp lưu trữ liệu máy tính nhằm sử dụng cách có hiệu liệu Và để sử dụng liệu cách hiệu cần phải có thuật tốn áp dụng liệu Do vậy, cấu trúc liệu giải thuật yếu tố khơng thể tách rời có liên quan chặt chẽ với Việc lựa chọn cấu trúc liệu ảnh hưởng lớn tới việc lựa chọn áp dụng giải thuật Về nguyên tắc, cấu trúc liệu giải thuật biểu diễn cài đặt ngôn ngữ lập trình đại Tuy nhiên, để có phân tích sâu sắc mơ phạm, có kết thực tế hơn, chúng tơi sử dụng ngôn ngữ tựa Pascal để minh hoạ cho cấu trúc liệu thuật tốn Mặc dầu có nhiều cố gắng, không tránh khỏi khiếm khuyết, mong nhận đóng góp ý kiến độc giả để giáo trình hồn thiện Hà Nội, ngày 23 tháng 04 năm 2021 Tham gia biên soạn Chủ biên Nguyễn Thị Kim Dung Tập thể Giảng viên Khoa CNTT Mọi thơng tin đóng góp chia sẻ xin gửi hịm thư kimdunghd2009@gmail.com, liên hệ số điện thoại 0977881209 MỤC LỤC LỜI GIỚI THIỆU CHƯƠNG 1: TỔNG QUAN VỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1.Khái niệm giải thuật đánh giá độ phức tạp giải thuật 1.1 Khái niệm giải thuật 1.2 Ngôn ngữ diễn đạt giải thuật 1.3 Thiết kế giải thuật 13 1.4 Đánh giá giải thuật 15 2.Các kiểu liệu 17 3.Kiểu ghi, kiểu trỏ 17 3.1 Kiểu ghi 18 3.2 Kiểu trỏ 18 Bài tập thực hành 18 4.Các kiểu liệu trừu tượng 18 5.Mối quan hệ CTDL giải thuật 19 Bài tập thực hành 21 CHƯƠNG 2: ĐỆ QUY VÀ GIẢI THUẬT ĐỆ QUY 22 1.Khái niệm đệ quy 22 2.Giải thuật đệ quy chương trình đệ quy 22 2.1 Giải thuật đệ qui 22 2.2 Chương trình đệ qui 22 3.Các toán đệ quy 22 3.1 Bài tốn tính n giai thừa 22 3.2 Bài toán dãy số FIBONACCI 23 Bài tập thực hành 23 CHƯƠNG 3: DANH SÁCH 26 1.Danh sách phép toán danh sách 26 1.1 Khái niệm danh dách 26 1.2 Các phép toán danh dách 26 2.Cài đặt danh sách theo cấu trúc mảng 26 2.1 Khởi tạo danh sách rỗng 27 2.2 Kiểm tra danh sách rỗng 27 2.3 Chèn phần tử vào danh sách 27 2.4 Xóa phần tử khỏi danh sách 28 3.Cài đặt danh sách theo cấu trúc danh sách liên kết (đơn, kép) 29 3.1 Khởi tạo danh sách rỗng 30 3.2 Kiểm tra danh sách rỗng 30 3.3 Chèn phần tử vào danh sách 30 3.4 Xóa phần tử khỏi danh sách 30 3.5 Danh sách liên kết vòng 31 3.6 Danh sách liên kết đôi 32 4.Cài đặt danh sách theo cấu trúc đặc biệt 32 4.1 Ngăn xếp 32 4.2 Hàng đợi 36 Bài tập thực hành 39 CHƯƠNG 4: CÁC PHƯƠNG PHÁP SẮP XẾP CƠ BẢN 41 1.Định nghĩa toán xếp 41 Phương pháp chọn (Selection sort) 41 2.1.Giới thiệu phương pháp 41 2.2.Giải thuật 41 2.3.Ví dụ minh họa 42 Phương pháp chèn (Insertion sort) 42 3.1.Giới thiệu phương pháp 42 3.2.Giải thuật 43 3.3.Ví dụ minh họa 43 Phương pháp đổi chỗ (Interchange sort) 44 4.1.Giới thiệu phương pháp 44 4.2.Giải thuật 44 4.3.Ví dụ minh họa 44 5.Phương pháp bọt (Bubble sort) 45 5.1.Giới thiệu phương pháp 45 5.2.Giải thuật 45 5.3.Ví dụ minh họa 45 6.Phương pháp xếp nhanh (Quick sort) 46 6.1.Giới thiệu phương pháp 46 6.2.Giải thuật 46 6.3.Ví dụ minh họa 47 Bài tập thực hành 48 CHƯƠNG 5: TÌM KIẾM 49 1.Tìm kiếm tuyến tính 49 1.1.Giới thiệu phương pháp 49 1.2.Giải thuật 49 1.3.Ví dụ minh họa 50 2.Tìm kiếm nhị phân 50 2.1.Giới thiệu phương pháp 50 2.2.Giải thuật 50 2.3.Ví dụ minh họa 51 Bài tập thực hành 51 GIÁO TRÌNH MƠN HỌC Tên mơn học: Cấu trúc liệu giải thuật Mã môn học: MHCNTT 08 Vị trí, tính chất, ý nghĩa vai trị mơn học: Vị trí: Mơn học bố trí sau sinh viên học xong môn học, mô đun: Lập trình bản, Cơ sở liệu Tính chất: Là mơn học Cơ sở Ý nghĩa vai trị môn học: Đây môn học sở ngành ngành liên quan đến công nghệ thông tin, cung cấp cho sinh viên kiến thức cấu trúc liệu giải thuật để làm tản cho việc lập trình giải vấn đề cần thiết Mục tiêu môn học: Về kiến thức: + Mô tả khái niệm kiểu liệu trừu tương, kiểu liệu, cấu trúc liệu giải thuật + Biết phép toán tương ứng với cấu trúc liệu giải thuật + Biết cách tổ chức liệu hợp lý, khoa học cho chương trình đơn giản Về kỹ + Áp dụng thuật toán hợp lý cấu trúc liệu tương ứng để giải tốn máy tính + Áp dụng phương pháp xếp, tìm kiếm Về lực tự chủ trách nhiệm: +Bố trí làm việc khoa học đảm bảo an toàn cho người phương tiện học tập Nội dung môn học: Thời gian Số TT Tên chương, mục Tổng số Lý thuyết Thực hành Chương 1: Tổng quan Cấu trúc liệu giải thuật Khái niệm giải thuật đánh giá độ phức tạp giải thuật Các kiểu liệu Kiểu liệu ghi, trỏ Các kiểu liệu trừu tượng Mối quan hệ CTDL giải thuật Chương : Đệ qui giải thuật đệ qui 1.Khái niệm đệ qui 2.Giải thuật đệ qui chương trình đệ qui 3.Các tốn đệ qui Chương 3: Danh sách 1.Danh sách phép toán danh sách 5 Kiểm tra* (LT hoặcTH) 2.Cài đặt danh sách theo cấu trúc mảng 3.Cài đặt danh sách theo cấu trúc danh sách liên kết (đơn, kép) 4.Cài đặt danh sách theo cấu trúc đặc biệt (ngăn xếp, hàng đợi) Chương 4: Các phương pháp xếp 1.Định nghĩa toán xếp 2.Phương pháp chọn (Selection sort) 3.Phương pháp chèn (Insertion sort) 4.Phương pháp đổi chỗ (Interchange sort) 5.Phương pháp bọt (Bubble sort) 6.Phương pháp xếp nhanh (Quick sort) Chương 5: Tìm kiếm 1.Tìm kiếm tuyến tính 2.Tìm kiếm nhị phân Thi kết thúc mơn học Cộng 20 12 45 27 16 1 CHƯƠNG 1: TỔNG QUAN VỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Mã chương: MHCNTT08-01 Giới thiệu: Tổng quan giải thuật Đầu tiên cách phân tích vấn đề, từ thực tiễn chương trình, cách thiết kế giải pháp cho vấn đề theo cách giải máy tính Tiếp theo, phương pháp phân tích, đánh giá độ phức tạp thời gian thực giải thuật xem xét chương Mục tiêu: - Mô tả khái niệm giải thuật, mối quan hệ cấu trúc liệu giải thuật Trình bày tiêu chuẩn để đánh giá độ phức tạp giải thuật - Ghi nhớ kiểu liệu bản, kiểu liệu trừu tượng cấu trúc liệu - Thực thao tác an tồn với máy tính 1.Khái niệm giải thuật đánh giá độ phức tạp giải thuật Mục tiêu: Mô tả khái niệm giải thuật, mối quan hệ cấu trúc liệu giải thuật Trình bày tiêu chuẩn để đánh giá độ phức tạp giải thuật 1.1 Khái niệm giải thuật Giải thuật, cịn gọi thuật tốn (algorithm) khái niệm quan trọng tin học Thuật ngữ thuật toán xuất phát từ nhà toán học Arập Abu Ja'far Mohammed ibn Musa al Khowarizmi (khoảng năm 825) Giải thuật thể giải pháp cụ thể, thực bước để đưa tới lời giải cho tốn Nói cách khác, giải thuật tập hữu hạn phép toán sở, đặt theo quy tắc xác, nhằm giải toán, qui tắc hay qui trình cụ thể nhằm giải vấn đề số bước hữu hạn, nhằm cung cấp kết từ tập hợp kiện đưa vào Các phép toán sở phép toán đơn giãn mà thời gian thực hữu hạn khơng phụ thuộc vào kích thước liệu Các phép toán giải thuật phải xác định rỏ ràng, dễ hiểu, không mập mờ Với liệu vào thoả mãn điều kiện toán, thuật toán phải dừng lại sau số hữu hạn bước cần thực 1.2 Ngôn ngữ diễn đạt giải thuật - Ngôn ngữ tự nhiên - Sơ đồ khối - Giả ngữ, ngôn ngữ ”tựa ngơn ngữ lập trình” - Ngơn ngữ lập trình (Pascal, C, ) Trong tài liệu sử dụng ngơn ngữ tựa Pascal để trình bày Sau số qui tắt bản: 1.2.1 Quy cách cấu trúc chương trình Mỗi chương trình gán tên để phân biệt, tên viết chữ in hoa, có thêm dấu gạch nối khố Program Ví dụ : Prorgram NHAN-MA-TRAN Độ dài tên không hạn chế Sau tên kèm theo lời thuyết minh (ở ta quy ước dùng Tiếng Việt) để giới thiệu tóm tắt nhiệm vụ giải thuật số chi tiết cần thiết Phần thuyết minh đặt hai dấu { } Chương trình bao gồm nhiều bước, bước phân biệt số thứ tự, kèm theo lời thuyết minh 1.2.2 Kí tự biểu thức Kí tự dùng giống ngôn ngữ chuẩn, nghĩa gồm : 26 chữ Latinh in hoa in thường 10 chữ số thập phân Các dấu phép toán số học: +, - , *, /, (lũy thừa) Các dấu phép toán quan hệ: , , , # Giá trị logic: true, false Dấu phép toán logic: and, or, not Tên biến dãy chữ chữ số, bắt đầu chữ Biến số có dạng : A[i], B[ij] v.v Còn biểu thức thứ tự ưu tiên phép toán biểu thức theo quy tắc PASCAL hay ngôn ngữ chuẩn khác 1.2.3 Các câu lệnh Các câu lệnh chương trình viết cách dấu chấm phảy chúng bao gổm : Câu lệnh gán Có dạng Tên biến/ Tên hàm : = Biểu thức Ở cho phép dùng phép gán chung Ví dụ : X : = Y : = Câu lệnh ghép Có dạng : begin Câu lệnh ; Câu lệnh ; ; Câu lệnhn end Nó cho phép ghép nhiều câu lệnh lại để coi câu lệnh Câu lệnh điều kiện Có dạng : if < Điều kiện > then < Câu lệnh > Có thể diễn tả sơ đồ : Điều kiện false true Câu lệnh1 Câu lệnh2 Hoặc if < Điều kiện > then < Câu lệnh1 > else < Câu lệnh2 > 10 End; Cách cài đặt danh sách liên kết đơn: Procedure Del(Var Q : Queue; Var X : Kieuphantu; Var OK : Boolean); Var P : pointer; Begin If IsEmpty(Q) Then OK := False Else begin P := Q^.F; X := Q.F^.Info; Q^.R := Q.F^.Link; OK := True; Dispose(P); end; End; Bài tập thực hành 3.1 Nêu ưu điểm nhược điểm phương pháp lưu trữ lưu trữ móc nối danh sách 3.2 Việc chèn phần tử vào “giữa” danh sách (không phải trước nút đầu sau nút cuối ) lưu trữ có khác so với lưu trữ móc nối ? 3.3 Với danh sách nối đơn , việc truy cập vào phần tử thực trực tiếp ? 3.4 Để xác định nút “đứng trước” nút cho danh sách nối đơn phải biết địa phải làm ? Với danh sách nối vịng, có không ? 3.5 Cho danh sách nối đơn , có trỏ LIST trỏ tới nút danh sách Viết giải thuật thực : a Cộng thêm số A vào số chứa trường INFO nút b Đếm số lượng nút có danh sách 3.6 Viết chương trình dùng cài đặt danh sách mảng: a Nhận dãy số nguyên nhập từ bàn phím lưu trữ theo thứ tự nhập vào b Nhận dãy số nguyên nhập từ bàn phím lưu trữ theo thứ tự ngược lại với thứ tự nhập vào c In hình phần tử danh sách theo thứ tự danh sách 3.7 Viết chương trình câu 3.6 dùng cài đặt danh sách danh sách lien kết đơn 3.8 Cài đặt Stack cách dùng trỏ, dùng Stack viết chương trình đổi số nguyên dương n hệ thập phân sang hệ nhị phân 3.9 Cho Queue lưu trữ nhớ vectơ Q có phần tử(ơ nhớ) hoạt động theo cấu trúc vòng Ban đầu Q có dạng : Hùng An Giao Thọ á F R Minh họa tình trạng Q nêu rỏ giá trị tương ứng F R sau lần thực phép : a Thương Hải bổ sung vào Q b Loại Hùng An khỏi Q 39 c Kha bổ sung vào Q d Loại tên khỏi Q 40 CHƯƠNG 4: CÁC PHƯƠNG PHÁP SẮP XẾP CƠ BẢN Mã chương: MHCNTT08-04 Giới thiệu: Do hệ thống thông tin thường phải lưu trữ khối lượng liệu đáng kể, nên việc xây dựng giải thuật cho phép tìm kiếm nhanh có ý nghĩa lớn Nếu liệu hệ thống tổ chức theo trật tự đó, việc tìm kiếm tiến hành nhanh chóng hiệu Do đó, xây dựng hệ quản lý thơng tin máy tính, bên cạnh thuật tốn tìm kiếm, thuật toán xếp liệu chủ đề quan tâm hàng đầu Mục tiêu: - Trình bày khái niệm tốn xếp; - Mô giải thuật, cách cài đặt, cách đánh giá giải thuật số phương pháp xếp bản; - Giải toán xếp sử dụng phương pháp xếp khảo sát - Thực thao tác an toàn với máy tính Nội dung chính: 1.Định nghĩa tốn xếp Mục tiêu: Trình bày định nghĩa tốn xếp Sắp xếp q trình xử lý bố trí lại danh sách đối tượng theo thứ tự Ví dụ ta cần xếp danh sách thí sinh theo tên với thứ tự Alphabet, xếp danh sách sinh viên theo điểm trung bình với thứ tự từ cao đến thấp Nhìn chung có nhiều xử lý liệu cần đến việc xếp liệu theo trật tự Ví dụ cần tìm kiếm đối tượng danh sách đối tượng giải thuật tìm kiếm nhị phân danh sách đối tượng phải xếp trước Các đối tượng cần xếp thường có nhiều thuộc tính cần chọn thuộc tính làm khóa xếp theo khóa Phương pháp chọn (Selection sort) Mục tiêu: - Mô giải thuật, cách cài đặt phương pháp xếp chọn trực tiếp; - Giải toán xếp sử dụng phương pháp xếp khảo sát 2.1.Giới thiệu phương pháp Ta thấy rằng, danh sách có thứ tự, phần tử min(ai, ai+1, , an-1) Ý tưởng thuật tốn chọn trực tiếp mơ cách xếp tự nhiên thực tế: chọn phần tử nhỏ N phần tử ban đầu, đưa phần tử vị trí đầu dãy hành; sau đó, xem dãy hành N-1 phần tử dãy ban đầu, vị trí thứ 2; lặp lại trình cho dãy hành đến dãy hành phần tử 2.2.Giải thuật Ðây phương pháp xếp đơn giản thực sau: Bước 1: i = 1; Bước 2: Tìm phần tử a[min] nhỏ dãy hành từ a[i] đến a[N] Bước : Hoán vị a[min] a[i] Bước : Nếu i ≤ N-1 i = i+1; Lặp lại Bước Ngược lại: Dừng //N-1 phần tử nằm vị trí Cài đặt thuật toán: 41 Procedure SelectionSort; Var pos,min,i,j:Integer; Begin for i:=1 to n-1 Begin min:=a[i]; pos:=i; {lưu lại vị trí phần tử nhỏ nhất} for j:=i to n Begin if(a[j]