(NB) Giáo trình Cấu trúc dữ liệu và giải thuật nhằm cung cấp cho sinh viên các thuật toán tổng quát, danh sách liên kết, và các giải thuật sắp xếp, tìm kiếm. Từ đó sinh viên sẽ từng bước cải tiến thuật toán để xây dựng được những chương trình hiệu quả và có tính ứng dụng cao. Mục đích của giáo trình là trang bị cho học viên những kiến thức và kỹ năng phân tích xây dựng được thuật toán kết hợp với giải thuật.
ỦY BAN NHÂN DÂN TỈNH BR – VT TRƯỜNG CAO ĐẲNG NGHỀ GIÁO TRÌNH MƠ ĐUN 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ố: 01/QĐ-CĐN ngày 04 tháng 01 năm 2016 Hiệu trưởng trường Cao đẳng nghề tỉnh Bà Rịa – Vũng Tàu Bà Rịa – Vũng Tàu, năm 2016 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 LỜI GIỚI THIỆU Giáo trình cấu trúc liệu giải thuật dùng cho học sinh hệ Cao Đẳng Trung cấp nghề lập trình máy tính hệ cao đẳng chun ngành công nghệ thông tin ứng dụng phần mềm trường Cao đẳng nghề Tỉnh BR – VT Nhằm cung cấp cho sinh viên thuật toán tổng quát, danh sách liên kết, giải thuật xếp, tìm kiếm Từ sinh viên bước cải tiến thuật tốn để xây dựng chương trình hiệu có tính ứng dụng cao Mục đích giáo trình trang bị cho học viên kiến thức kỹ phân tích xây dựng thuật tốn kết hợp với giải thuật Để nắm bắt kiến thức học sinh cần trang bị kiến thức mơn lập trình Ngơn ngữ lập trình chọn để minh họa kiến thức Dev C++ Trong qua trình biên soạn giáo trình, chắn chắn giáo trình cịn nhiều khiếm khuyết, tác giả mong muốn nhận ý kiến q báu đóng góp đồng nghiệp bạn đọc để giáo trình hồn thiện mặt nội dung hình thức lần tái sau Bà Rịa – Vũng Tàu, ngày 02 tháng 01 năm 2016 Biên soạn Nguyễn Thị Mai MỤC LỤC TRANG CHƯƠNG TRÌNH MƠ ĐUN BÀI GIỚI THIỆU CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Mối liên hệ giải thuật cấu trúc liệu 1.1 Giải thuật 1.2 Dữ liệu 1.3 Mối quan hệ cấu trúc liệu giải thuật 10 Kiểu liệu, mô hình liệu, kiểu liệu trừu tượng 10 2.1.Khái niệm kiểu liệu 10 2.2 Mơ hình kiểu liệu 10 2.3 Kiểu liệu trừu tượng 11 Thiết kế phân tích giải thuật 12 3.1 Thiết kế thuật tốn 12 3.2 Phân tích tính đắn giải thuật 12 3.3 Phân tích tính đơn giản 12 Một số ví dụ thiết kế phân tích giải thuật 13 BÀI LÀM VIỆC VỚI CON TRỎ 15 Biến trỏ 15 1.1 Khái niệm trỏ ( pointer ) 15 1.3 Gán địa biến cho biến trỏ 16 1.4 Cấp phát vùng nhớ cho biến trỏ 16 1.5 Giải phóng vùng nhớ cho biến trỏ 17 1.6 Một số phép toán trỏ 17 Con trỏ mảng chiều 18 Con trỏ mảng nhiều chiều 20 BÀI LÀM VIỆC VỚI KIỂU CẤU TRÚC 22 Khái niệm cấu trúc 22 Khai báo kiểu cấu trúc 22 Truy nhập đến thành phần biến cấu trúc 25 Nhập liệu cho biến cấu trúc 25 BÀI LÀM VIỆC VỚI KIỂU TẬP TIN 29 Khái niệm tập tin 29 Các kiểu vào với tệp: 30 2.1 Khai báo biến tập tin 30 2.2 Mở tập tin 30 2.3 Đóng tập tin 32 2.4 Kiểm tra đến cuối tập tin hay chưa? 32 2.5 Di chuyển trỏ tập tin đầu tập tin - Hàm rewind() 32 Các thao tác tệp: 32 3.1 Ghi liệu lên tập tin văn 32 3.2 Đọc liệu từ tập tin văn 34 BÀI THÊM PHẦN TỬ TRONG DANH SÁCH ĐẶC 37 Định nghĩa 37 Khởi tạo danh sách 37 Thêm phần tử vào danh sách 38 3.1.Thêm vào đầu danh sách: 38 3.2.Thêm vào cuối danh sách: 38 3.3 Thêm vào vị trí danh sách: 38 BÀI XÓA PHẦN TỬ TRONG DANH SÁCH ĐẶC 40 Xóa phần tử đầu 40 Xóa phần tử cuối 40 Xóa phần tử vị trí danh sách: 40 BÀI LÀM VIỆC VỚI DANH SÁCH LIÊN KẾT 42 Định nghĩa: 42 Khai báo nút 43 Khai báo danh sách 43 Khởi tạo nút 43 Khởi tạo danh sách 44 Nhập danh sách 44 Xuất danh sách 45 BÀI CHÈN PHẦN TỬ TRONG DANH SÁCH LIÊN KẾT 46 Chèn nút vào đầu danh sách 46 Chèn nút vào cuối danh sách 47 Chèn nút vào vị trí 47 BÀI XÓA PHẦN TỬ TRONG DANH SÁCH LIÊN KẾT 49 Xóa nút đầu danh sách 49 Xóa nút cuối danh sách 49 Hủy danh sách 50 BÀI 10 LÀM VIỆC VỚI NGĂN XẾP 52 1.4 Lấy phần tử khỏi ngăn xếp 54 1.5 Thêm phần tử vào ngăn xếp 54 2.3 Lấy phần tử khỏi ngăn xếp 55 2.4 Thêm phần tử vào ngăn xếp 56 2.5 Xóa phần tử ngăn xếp 56 BÀI 11 LÀM VIỆC VỚI HÀNG ĐỢI(QUEUE) 58 Biểu diễn hàng đợi dùng mảng: 59 2.4 Lấy phần tử ở đầu Queue 62 BÀI 12 SỬ DỤNG CÁC PHƯƠNG PHÁP SẮP XẾP 65 Định nghĩa toán xếp: 65 2.3 Giải thuật: 66 Phương pháp xếp bọt 68 3.3 Giải thuật: 68 Phương pháp đổi chỗ trực tiếp 69 4.3 Giải thuật: 69 Phương pháp chèn trực tiếp( insertion sort) 71 5.3 Giải thuật: 72 Phương pháp tìm kiếm nhị phân 76 2.1 Ý tưởng 76 TÀI LIỆU CẦN THAM KHẢO: 79 CHƯƠNG TRÌNH MƠ ĐUN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Mã số mô đun: MĐ15 VỊ TRÍ, TÍNH CHẤT CỦA MƠ ĐUN: -Vị trí: Mô đun học sau mô đun Tin học văn phịng, Lập trình bản, sở liệu -Tính chất: Mơ đun u cầu phải có tư logic kiến thức lập trình MỤC TIÊU MƠ ĐUN: - Trình bày kiểu liệu - Phân tích xây dựng thuật tốn - Phân tích loại liệu, giải thuật kết hợp liệu giải thuật - Thực thao tác kiểu liệu -Cài đặt thuật toán xếp tìm kiếm - Cài đặt thuật toán cấu trúc liệu: mảng, danh sách, danh sách liên kết đơn - Có tinh thần trách nhiệm, ý thức tổ chức kỷ luật, tác phong công nghiệp, tinh thần hợp tác công việc - Có ý chủ động, độc lập cơng việc, tự học cập nhật kiến thức, nâng cao trình độ chuyên mơn NỘI DUNG CỦA MƠ ĐUN: Tên mơ đun Thời gian Hình thức giảng dạy Giới thiệu cấu trúc liệu giải thuật Tích hợp Làm việc với trỏ Tích hợp Làm việc với kiểu cấu trúc Tích hợp Làm việc với kiểu tập tin Tích hợp Kiểm tra 1,2,3,4 STT Thêm phần tử danh sách đặc Tích hợp Xóa phần tử danh sách đặc Tích hợp Kiểm tra 5,6 Làm việc với danh sách liên kết Tích hợp Chèn phần tử danh sách liên kết Tích hợp Xóa phần tử danh sách liên kết Tích hợp 10 Làm việc với ngăn xếp Tích hợp 11 Làm việc với hàng đợi Tích hợp Kiểm tra 7,8,9,10,11 Sử dụng phương pháp xếp Sử dụng phương pháp tìm kiếm Kiểm tra 12,13 Cộng 10 75 12 13 Tích hợp Tích hợp BÀI GIỚI THIỆU CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Giới thiệu: Giải thuật 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 Qua học giới thiệu cách thật cụ thể cấu trúc liệu giải thuật Mục tiêu: - Trình bày kiến thức cở cấu trúc liệu, giải thuật, kiểu liệu, mơ hình liệu - Phân tích giải thuật - Sử dụng phương pháp phân tích, thiết kế giải thuật - Rèn luyện tính cẩn thận, kiên trì, sáng tạo - Bảo đảm an toàn vệ sinh cho người thiết bị phòng máy Nội dung Mối liên hệ giải thuật cấu trúc liệu 1.1 Giải thuật Giải thuật bước cần tác động theo thứ tự định sở bổ liệu vào để đạt liệu với chân lý Dữ liệu vào Input Giải thuật Dữ Dữliệu liệurara Out put 1.2 Dữ liệu Có thể nói khơng có chương trình máy tính mà khơng có liệu để xử lý Dữ liệu liệu đưa vào (input data), liệu trung gian liệu đưa ra(output data) Do vậy, việc tổ chức để lưu trữ liệu phục vụ cho chương trình có ý nghĩa quan trọng tồn hệ thống chương trình Việc xây dựng cấu trúc liệu định lớn đến chất lượng cơng sức người lập trình việc thiết kế, cài đặt chương trình 1.3 Mối quan hệ cấu trúc liệu giải thuật Mối quan hệ cấu trúc liệu Giải thuật minh họa đẳng thức: Cấu trúc liệu + Giải thuật = Chương trình Như vậy, có cấu trúc liệu tốt, nắm vững giải thuật thực việc thể chương trình ngôn ngữ cụ thể vấn đề thời gian Khi có cấu trúc liệu mà chưa tìm thuật giải khơng thể có chương trình ngược lại khơng thể có giải thuật chưa có cấu trúc liệu Một chương trình máy tính hồn thiện có đầy đủ Cấu trúc liệu để lưu trữ liệu Giải thuật xử lý liệu theo yêu cầu tốn đặt Kiểu liệu, mơ hình liệu, kiểu liệu trừu tượng 2.1.Khái niệm kiểu liệu Kiểu liệu T xem kết hợp thành phần: - Miền giá trị mà kiểu liệu T lưu trữ: V, - Tập hợp phép toán để thao tác liệu: O T = Mỗi kiểu liệu thường đại diện tên (định danh) Mỗi phần tử liệu cókiểu T có giá trị miền V thực phép toán thuộc tập hợpcác phép toán O Để lưu trữ phần tử liệu thường phải tốn số byte(s) nhớ, sốbyte(s) gọi kích thước kiểu liệu 2.2 Mơ hình kiểu liệu Hầu hết ngơn ngữ lập trình có cung cấp kiểu liệu sở Tùy vào ngôn ngữ mà kiểu liệu sở có tên gọi khác song lại có loại kiểu liệu sở sau: - Kiểu số ngun: Có thể có dấu khơng có dấu thường có kích thước sau: 10 67 Phương pháp xếp bọt 3.1 Ý tưởng: + Xuất phát từ cuối dãy, đổi chỗ cặp phần tử kế cận để đưa phần tử nhỏ cặp phần tử vị trí đứng đầu dãy hành, sau khơng xét đến bước tiếp theo, lần xử lý thứ i có vị trí đầu dãy i + Lặp lại xử lý khơng cịn cặp phần tử để xét 3.2 Các bước tiến hành: + Bước 1: i = 0;// lần xử lý + Bước 2: j=N-1;//Duyệt từ cuối dãy ngược vị trí i Trong (j a[j-1] Doicho(a[j],a[j-1]); j = j-1 + Bước : i = i+1; // lần xử lý Nếu i>N-1 : Hết dãy Dừng Ngược lại: Lặp lai Bước 3.3 Giải thuật: void SXNoibot(int a[],int n) { int i, j,tg; for (i = ; ii ; j ) if(a[j]< a[j-1])// sai vị trí đổi chỗ { tg=a[i]; a[i]=a[j]; a[j]=tg; } } Ví dụ: cho dãy số: 12 15 68 Phương pháp đổi chỗ trực tiếp 4.1 Ý tưởng giải thuật: Xuất phát từ đầu dãy, tìm tất các nghịch chứa phần tử này, triệt tiêu chúng cách đổi chỗ phần tử cặp nghịch Lặp lại xử lý với phần tử kế dãy.( Nghịch thế: Là xét dãy a1, a2, ……… an Nếu iaj gọi nghịch thế) 4.2 Các bước tiến hành + Bước 1: i = 0; // đầu dãy + Bước 2: j = i+1; //tìm nghịch với a[i] + Bước 3: Trong j < N thực Nếu a[j]=0)) //kết hợp dời chỗ phần tử đứng sau k dãy { a[j+1]=a[j]; j ; } a[j+1]=k;// chèn k vào dãy } } Ví dụ: cho dãy số: 12 15 72 Câu hỏi, tập: Viết chương trình nhập vào mảng gồm số nguyên thực yêu cầu sau: - In mảng vừa nhập hình - Sắp xếp mảng theo thứ tự tăng dần phương pháp xếp bọt 73 - Sắp xếp mảng theo thứ tự tăng dần phương pháp đổi chỗ trực tiếp - Sắp xếp mảng theo thứ tự giảm dần phương pháp xếp chọn trực tiếp - Sắp xếp mảng theo thứ tự giảm dần phương pháp xếp chèn trực tiếp u cầu đánh giá - Trình bày thuật tốn xếp bọt, đổi chỗ trực tiếp, xếp chọn trực tiếp, xếp chèn trực tiếp - Thực xếp mảng phương pháp xếp bọt, đổi chỗ trực tiếp, xếp chọn trực tiếp, xếp chèn trực tiếp - Viết chương trình chạy, kiểm tra kết 74 BÀI 13 SỬ DỤNG CÁC PHƯƠNG PHÁP TÌM KIẾM Giới thiệu: Tìm kiếm nhu cầu thiết yếu sống, đương nhiên, ngoại lệ lập trình Chúng ta có nhiều thuật tốn để thực thao tác tìm kiếm Qua giới thiệu thuật tốn tìm kiếm Mục tiêu: - Trình bày ý tường, giải thuật thuật tốn tìm kiếm tuyến tính, nhị phân - Áp dụng thuật tốn thuật tốn tìm kiếm tuyến tính , nhị phân vào tập - Rèn luyện tính cẩn thận, kiên trì, sáng tạo, độc lập hoạt động nhóm - Bảo đảm an toàn vệ sinh cho người thiết bị phịng máy Nội dung chính: Phương pháp tìm kiếm tuyến tính 1.1 Ý tưởng So sánh X với phần tử thứ 1, thứ 2,…của mảng a gặp khóa cần tìm, tìm hết mảng mà khơng thấy 1.2 Các bước tiến hành - Bước 1: Khởi gán i=0; - Bước 2: So sánh a[i] với giá trị x cần tìm, có khả + a[i] = = x tìm thấy x Dừng; + a[i] != x sang bước 3; - Bước 3: i=i+1 // Xét tiếp phần tử mảng Nếu i= =N: Hết mảng Dừng; Ngược lại: Lặp lại bước 2; 1.3 Giải thuật: Từ mơ tả thuật tốn tìm tuyến tính, cài đặt hàm TimTuyenTinh để xác định vị trí phần tử khóa x mảng a : int TimTT (int a[], int N, int x) { int i=0; while ((iai x xuất đoạn [a i + ,aN] + Nếu xx : // Tìm tiếp x dãy aleft…amid – Right= mid-1; a[mid]