Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 112 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
112
Dung lượng
1,11 MB
Nội dung
MỤC LỤC 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 1.4 Các bước đểgiải toán 13 BÀI PHÂN TÍCH THỜI GIAN THỰC HIỆN GIẢITHUẬT 20 2.1 Giới thiệu 20 2.2 Các ký pháp để đánh giá độ phức tạp tính toán 20 2.3 Xác định độ phức tạp giảithuật 22 2.4 Độ phức tạp tính toán với tình trạng liệu vào 26 2.5 Chi phí thực thuật toán 27 Bài ĐỆ QUY VÀGIẢITHUẬTĐỆ QUY 28 3.1 Khái niệm đệ quy 28 3.2 Giảithuậtđệ quy 28 3.3.Ví dụgiảithuậtđệ quy 28 3.4 Bài tập giảithuậtđệ quy 29 BÀI MẢNG VÀ DANH SÁCH .30 4.1 Mảng 30 4.2 Danh sách 40 4.2 Danh sách 40 4.3 ArrayList 43 BÀI 5: DANH SÁCH NỐI ĐƠN (Singlely Linked List) .46 5.1 Khái niệm danh sách nối đơn 46 5.2 Một số phép toán danh sách nối đơn 47 BÀI 6: DANH SÁCH NỐI VÒNG VÀ NỐI KÉP .55 6.1 Danh sách nối vòng (Circulary Linked List) 55 6.2 Danh sách nối kép 58 BÀI 7.BÀI TẬP VỀ DANH SÁCH LIÊN KẾT 68 7.1 Khái niệm danh sách liên kết 68 7.2 Cách khai báo danh sách liên kết 68 7.3 Các thao tác danh sách liên kết 68 7.4 Ưu nhược điểm sử dụng danh sách liên kết để lưu trữ danh sách 68 BÀI 8: NGĂN XẾP VÀ HÀNG ĐỢI 69 8.1.Ngăn xếp(Stack) 69 8.2 Hàng đợi (Queue) 72 8.3 Một số ứng dụng ngăn xếp 78 Bài 9: BÀI TẬP VỀ NGĂN XẾP VÀ ỨNG DỤNG CỦA NGĂN XẾP 84 Bài 10: CÂY 85 10.1 Định nghĩa 85 10 Cây nhị phân 86 10.3 Biểu diễn nhị phân 87 10.4 Phép duyệt nhị phân 90 10.5 Cây k-phân 92 10.6 Cây tổng quát 92 Bài 11: BÀI TẬP VỀ CÂY NHỊ PHÂN 95 Bài 12: SẮP XẾP 96 12.1 Bài toán xếp 96 12.2 Thuật toán xếp kiểu chọn (Selection sort) 97 12.3 Thuật toán xếp kiểu bọt (Bubble sort) 98 12.4 Thuật toán xếp kiểu chèn (Insertion sort) 100 12.5 Bài tập thuật toán xếp 101 Trang 12.6 Sắp xếp kiểu phân đoạn (Partition Sort) hay Sắp xếp nhanh (Quick Sort) 102 12.7 Sắp xếp kiểu vun đống (Heap Sort) 103 12.8 Sắp xếp kiểu hoà nhập (Merge Sort) 105 Bài 13: TÌM KIẾM .107 13.1 Bài toán tìm kiếm 107 13.2 Tìm kiếm 107 13.3 Tìm kiếm nhị phân 108 13.4 Cây nhị phân tìm kiếm 109 Bài 14: Thảo luận – Ôn tập tổng kết môn học 112 TÀI LIỆU THAM KHẢO 112 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 sử dụng cách hiệu Thông thường, cấutrúcliệu 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 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 triển khai cách sử dụng kiểu liệu, tham chiếu phép toán 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 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 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 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 nghĩ trước đểgiải vấn đề Phương pháp thường độc lập với máy tính cụ thể 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, thân chương trình máy tính 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” 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 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 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 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 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 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 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 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, 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ử 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ài đặt sau : void XuatDiem() //Xuất điểm số tất sinh viên { const int so_mon = 4; int sv,mon; Trang for (int i=0; iR) Giảithuật tìm kiếm khóa X dãy khóa K[0 … N-1] Nếu tìm thấy khóa X K trả số khóa ấy, ngược lại trả giá trị -1 int BinarySearch(K, X) { int L = 0, R = K.Length-1; while( L T.info thêm X vào phải T - Nếu X.info < T.info thêm X vào trái T ? Sinh viên viết giảithuật cho thuật toán c) Thuật toán tìm kiếm khóa X nhị phân tìm kiếm T So sánh X với giá trị nút gốc; có tình huốn xảy ra: - T == null, phép tìm kiếm thất bại - T.info == X, phép tìm kiếm thành công - T.info > X, tiếp tục tìm kiếm X trái T với cách làm tương tự - T.info < X, tiếp tục tìm kiếm X phải T với cách làm tương tự Giảithuật Trang 109 bool BSTSearch(X, T) { P= T; while(P!= null){ if (P.info == X) return true; else if(P.info > X) P = P.left else P = P.right } } ?Sinh viên tự viết giảithuậtđệ qui cho thuật toán d) Thuật toán loại bỏ nút từ nhị phân tìm kiếm Muốn xóa nút có giá trị X nhị phân tìm kiếm ta thực sau: 1) Tìm đến nút P nút có giá trị X 2) Nếu P nút thay liên kết từ nút cha P đến P null Hình 13.2: Xóa nút nút 3) Nút D có nhánh con, ta đem nút gốc nhánh vào chỗ nút D, tức chỉnh lại mối nối: Từ nút cha nút D không nối tới nút D mà nối tới nhánh nút D Trang 110 Hình 13.3: Xóa nút nhị phân tìm kiếm có nhánh 4) Nút P có nhánh trái phải, có cách làm hợp lý: - Hoặc tìm nút chứa khóa lớn trái, đưa giá trị chứa sang nút P, xóa nút Hình 14.4: Xóa nút nhị phân tìm kiếm có nhánh Hoặc tìm nút có khóa nhỏ phải P, đưa giá trị nút sang P xóa nút Hình 14.5: Xóa nút nhị phân tìm kiếm có nhánh ? Sinh viên tự viết giảithuật thêm, xóa nút từ nhị phân tìm kiếm Trang 111 ? Sinh viên thực minh họa giảithuật dựng nhị phân tìm kiếm,tìm kiếm nút có khóa X nhị phân tìm kiếm vừa tạo Bài 14: Thảo luận – Ôn tập tổng kết môn học - Qui tắc đánh giá độ phức tạp thuật toán - Giảithuậtđệ qui - Stack ứng dụng Stack - Queue - Danh sách liên kết đơn - Cây nhị phân, nhị phân tìm kiếm ứng dụng - Các giảithuật xếp, tìm kiếm - Giải đáp câu hỏi sinh viên TÀI LIỆU THAM KHẢO [1] Bộ môn CNPM, Đềcương “Cấu trúcliệugiải thuật”, ĐHSPKT Hưng Yên, Sách tham khảo: [2] Bộ môn CNPM, “Bài tập Cấutrúcliệugiải thuật”, ĐHSPKT Hưng Yên, 2006 [3] Đỗ Xuân Lôi, “Cấu trúcliệugiải thuật”, NXB ĐHQG, 2006 [4] Esakov J, “Bài tập nâng cao Cấutrúcliệu cài đặt C”, Weiss T, Biên dịch Gia Việt, NXB Thống Kê, 2005 [5] M and Deitel J., “How to Program Java”, 4th edition, Deitel Prentice Hall, 2002 [6] Niklaus Wirth, “Cấu trúcliệu + Giảithuật = Chương trình”, Người dịch: Nguyễn Quốc Cường, NXB KHKT, 1998 [7] Robert Lafore, “Data Structures & Algorithms in Java”, SAMS Published, 2001 Trang 112