Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 101 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
101
Dung lượng
1,31 MB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN ĐỀCƯƠNG BÀI GIẢNG CẤUTRÚCDỮLIỆUVÀGIẢITHUẬT TRÌNH ĐỘ ĐÀO TẠO: ĐẠI HỌC CHÍNH QUY NGÀNH ĐÀO TẠO: CÔNG NGHỆ THÔNG TIN (INFORMATION TECHNOLOGY) Hưng Yên, năm 2016 Trang MỤC LỤC MỤC LỤC LỜI NÓI ĐẦU BÀI 1: GIẢITHUẬTVÀCẤUTRÚCDỮLIỆU 1.1 Mở đầu 1.2 Mối quan hệ cấutrúcliệugiảithuật 1.3 Một số phương pháp biểu diễn thuật toán 11 1.4 Các bước đểgiải toán 15 1.5 Phân tích thời gian thực giảithuật 21 Bài ĐỆ QUY VÀGIẢITHUẬTĐỆ QUY 30 2.1 Khái niệm đệ quy 30 2.2 Giảithuậtđệ quy 30 2.3.Ví dụgiảithuậtđệ quy 30 2.4 Bài tập giảithuậtđệ quy 31 Bài 3: MẢNG VÀ DANH SÁCH 32 3.1 Mảng 32 3.2 Danh sách 38 Bài 4: DANH SÁCH NỐI ĐƠN (Single Linked List) 42 4.1 Định nghĩa nguyên tắc danh sách nối đơn 42 Trang 4.2 Một số phép toán danh sách nối đơn 43 Tìm phần tử danh sách đơn 49 Hủy phần tử khỏi danh sách 50 Duyệt danh sách 53 Bài 5: NGĂN XẾP VÀ HÀNG ĐỢI 56 5.1 Ngăn xếp (Stack) 56 5.1.1 Định nghĩa 56 5.2 Hàng đợi 60 5.2.1 Định nghĩa 60 5.2.2 Cài đặt hàng đợi 62 5.3 Một số ứng dụng Stack 69 5.4 Bài tập Stack 74 Bài 6: BÀI TẬP VỀ DANH SÁCH LIÊN KẾT 75 Bài 7: CÂY 76 7.1 Định nghĩa 76 7.2 Cây nhị phân 77 7.3 Biểu diễn nhị phân 78 7.4 Phép duyệt nhị phân 80 7.5 Cây k-phân 82 7.6 Cây tổng quát 83 Trang Bài 8: BÀI TẬP VỀ CÂY NHỊ PHÂN 87 Bài 9: SẮP XẾP 88 9.1 Bài toán xếp 88 9.2 Thuật toán xếp kiểu chọn (Selection sort) 89 9.3 Thuật toán xếp kiểu nổi bọt (Bubble sort) 90 9.4 Thuật toán xếp kiểu chèn (Insertion sort) 92 9.5 Bài tập thuật toán xếp 94 Bài 10: TÌM KIẾM 95 10.1 Bài toán tìm kiếm 95 10.2 Tìm kiếm 95 10.3 Tìm kiếm nhị phân 96 10.4 Cây nhị phân tìm kiếm 97 TÀI LIỆU THAM KHẢO 101 Trang LỜI NÓI ĐẦU Trong khoa học máy tính, cấutrúcliệu cách lưu liệu máy tính cho được sử dụng cách hiệu Thông thường, cấutrúcliệu được chọn cẩn thận cho phép thực thuật toán hiệu Việc chọn cấutrúcliệu thường chọn cấutrúcliệu trừu tượng Một cấutrúcliệu được thiết kế tốt cho phép thực nhiều phép toán, sử dụng tài nguyên, thời gian xử lý không gian nhớ tốt Các cấutrúcliệu được triển khai cách sử dụng kiểu liệu, tham chiếu phép toán được cung cấp ngôn ngữ lập trình Trong thiết kế nhiều loại chương trình, việc chọn cấutrúcliệu vấn đề quan trọng Kinh nghiệm việc xây dựng hệ thóng lớn cho thấy khó khăn việc triển khai chương trình, chất lượng hiệu kết cuối phụ thuộc nhiều vào việc chọn cấutrúcliệu tốt Sau cấutrúcliệu được chọn, người ta thường dễ nhận thấy thuật toán cần sử dụng Đôi trình tự công việc diễn theo thứ tự ngược lại: Cấutrúcliệu được chọn toán quan trọng định có thuật toán chạy tốt với số cấutrúcliệu cụ thể Trong hai trường hợp, việc lựa chọn cấutrúcliệu quan trọng Trong modul này, với thời lượng hạn chế, trình bày vấn đềcấutrúcliệu danh sách nối đơn, kép, ngăn xếp, hàng đợi, Còn nhiều cấutrúcliệu mạnh khác tập hợp, bảng băm, B-tree,… mà modul không đủ thời lượng trình bày Ngoài ra, thuật toán được trình bày ngắn gọn liền với cấutrúcliệu tương ứng Hưng Yên, tháng 03 năm 2016 Trang BÀI 1: GIẢITHUẬTVÀCẤUTRÚCDỮLIỆU 1.1 Mở đầu Khi viết chương trình máy tính, ta thường cài đặt phương pháp được nghĩ trước đểgiải vấn đề Phương pháp thường độc lập với máy tính cụ thể được dùng để cài đặt: Hầu thích hợp cho nhiều máy tính Trong trường hợp nào, phương pháp, chứ thân chương trình máy tính được nghiên cứu để học cách làm để công vào toán từ “Giải thuật” hay “Thuật toán” được dùng khoa học máy tính để mô tả phương pháp giải toán thích hợp cài đặt chương trình máy tính Giảithuật chúng đối tượng nghiên cứu trung tâm hầu hết lĩnh vực Tin học Các chương trình máy tính thường tối ưu, không cần thuật toán tối ưu, trừ thuật toán được dùng lại nhiều lần Nếu không cần cài đặt đơn giản cẩn thận đủđể ta tin tưởng hoạt động tốt chạy chậm đến mười lần phiên tốt, điều có nghĩa chạy chậm vài giây, ta chọn thiết kế cài đặt tối ưu phức tạp từ đầu tốn nhiều phút, nhiều giờ… Do ta xem xét cài đặt hợp lý đơn giản thuật toán tốt Thông thường đểgiải toán ta có lựa chọn nhiều thuật toán khác, việc lựa chọn thuật toán tốt vấn đề tương đối khó khăn phức tạp, thường cần đến trình phân tích tinh vi tin học Khái niệm Giảithuật có từ lâu nhà toán học người Arập phát ngôn, thuật toán nổi tiếng có từ thời cổ Hylạp thuật toán Euclid (thuật toán tìm ước số chung lớn số) Phương pháp cộng, nhân, chia… hai số giải thuật… Trong Tin học khái niệm giảithuật được trình bày sau: Giảithuậtcâu lệnh (Statements) chặt chẽ rõ ràng xác định trình tự thao tác số đối tượng cho sau số hữu hạn bước thực ta đạt kết mong muốn (Thuật toán dãy hữu hạn bước, bước mô tả xác phép toán hành động cần thực hiện, đểgiải vấn đề) Đối tượng Input kết mong muốn Output thuật toán Euclid Trang 1.2 Mối quan hệ cấutrúcliệugiảithuật Thực đề án tin học chuyển toán thực tế thành toán giải máy tính Một toán thực tế bao gồm đối tượng liệu yêu cầu xử lý đối tượng Vì thế, để xây dựng mô hình tin học phản ánh được toán thực tế cần trọng đến hai vấn đề : Tổ chức biểu diễn đối tượng thực tế : Các thành phần liệu thực tế đa dạng, phong phú thường chứa đựng quan hệ với nhau, mô hình tin học toán, cần phải tổ chức , xây dựng cấutrúc thích hợp cho vừa phản ánh xác liệu thực tế này, vừa dễ dàng dùng máy tính để xử lý Công việc được gọi xây dựng cấutrúcliệu cho toán Xây dựng thao tác xử lý liệu: Từ yêu cầu xử lý thực tế, cần tìm giảithuật tương ứng để xác định trình tự thao tác máy tính phải thi hành kết mong muốn, bước xây dựng giảithuật cho toán Tuy nhiên giải toán máy tính, thường có khuynh hướng trọng đến việc xây dựng giảithuật mà quên tầm quan trọng việc tổ chức liệu toán Giảithuật phản ánh phép xử lý , đối tượng xử lý giảithuật lại liệu, liệu chứa đựng thông tin cần thiết để thực giảithuậtĐể xác định được giảithuật phù hợp cần phải biết tác động đến loại liệu (ví dụđể làm nhuyễn hạt đậu , người ta dùng cách xay chứ không băm dao, đậu văng ngoài) chọn lựa cấutrúcliệu cần phải hiểu rõ thao tác tác động đến (ví dụđể biểu diễn điểm số sinh viên người ta dùng số thực thay chuỗi ký phải thực thao tác tính trung bình từ điểm số đó) Như đề án tin học, giảithuậtcấutrúcliệu có mối quan hệ chặt chẽ với nhau, được thể qua công thức : Cấutrúcliệu + Giảithuật = Chương trình Với cấutrúcliệu chọn, có giảithuật tương ứng, phù hợp Khi cấutrúcliệu thay đổi thường giảithuật phải thay đổi theo để tránh việc xử lý gượng ép, thiếu tự nhiên cấutrúc không phù hợp Hơn nữa, cấutrúcliệu tốt giúp giảithuật xử lý phát huy tác dụng tốt hơn, vừa đáp ứng nhanh vừa tiết kiệm vật tư, giảithuậtdễ hiễu đơn giản Trang Ví dụ 1.1: Một chương trình quản lý điểm thi sinh viên cần lưu trữ điểm số sinh viên Do sinh viên có điểm số ứng với môn học khác nên liệu có dạng bảng sau: Sinh viên Môn Môn Môn3 Môn4 SV SV SV Chỉ xét thao tác xử lý xuất điểm số môn sinh viên Giả sử có phương án tổ chức lưu trữ sau: Phương án : Sử dụng mảng chiều Có tất 3(SV)*4(Môn) = 12 điểm số cần lưu trữ, khai báo mảng result sau : int[] result = new int [ 12 ] {7, 9, 5, 2,5, 0, 9, 4,6, 3, 7, 4}; mảng result phần tử được lưu trữ sau: Và truy xuất điểm số môn j sinh viên i - phần tử (dòng i, cột j) bảng - phải sử dụng công thức xác định số tương ứng mảng result: bảngđiểm(dòng i, cột j) result[((i-1)*số cột) + j] Ngược lại, với phần tử mảng, muốn biết điểm số sinh viên nào, môn gì, phải dùng công thức xác định sau result[ i ] bảngđiểm (dòng((i / số cột) +1), cột (i % số cột) ) Với phương án này, thao tác xử lý được cài đặt sau : void XuatDiem() //Xuất điểm số tất sinh viên { int so_mon = 4; int sv,mon; for (int i=0; i