Đề cương cấu trúc dữ liệu và giải thuật (ĐHCQ)

112 185 0
Đề cương cấu trúc dữ liệu và giải thuật (ĐHCQ)

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

MỤC LỤC BÀI 1: GIẢI THUẬT CẤU TRÚC DỮ LIỆU 1.1 Mở đầu 1.2 Mối quan hệ cấu trúc liệu giải thuậ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ẢI THUẬ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ải thuậ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 GIẢI THUẬT ĐỆ QUY 28 3.1 Khái niệm đệ quy 28 3.2 Giải thuật đệ quy 28 3.3.Ví dụ giải thuật đệ quy 28 3.4 Bài tập giải thuật đệ quy 29 BÀI MẢNG 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 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 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 Ứ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ấu trúc liệu cách lưu liệu máy tính cho sử dụng cách hiệu Thông thường, cấu trúc liệu chọn cẩn thận cho phép thực thuật toán hiệu Việc chọn cấu trúc liệu thường chọn cấu trúc liệu trừu tượng Một cấu trúc liệ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ấu trúc liệ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ấu trúc liệ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ấu trúc liệu tốt Sau cấu trúc liệ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ấu trúc liệu chọn toán quan trọng định có thuật toán chạy tốt với số cấu trúc liệu cụ thể Trong hai trường hợp, việc lựa chọn cấu trúc liệu quan trọng Trong modul này, với thời lượng hạn chế, trình bày vấn đề cấu trúc liệu danh sách nối đơn, kép, ngăn xếp, hàng đợi, Còn nhiều cấu trúc liệ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ấu trúc liệu tương ứng Hưng Yên, tháng 03 năm 2016 Trang BÀI 1: GIẢI THUẬT CẤU TRÚC DỮ 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ải thuậ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ải thuậ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ải thuật trình bày sau: Giải thuật câ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ấu trúc liệu giải thuậ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ấu trú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ấu trúc liệ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ải thuậ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ải thuậ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ải thuật mà quên tầm quan trọng việc tổ chức liệu toán Giải thuật phản ánh phép xử lý , đối tượng xử lý giải thuật lại liệu, liệu chứa đựng thông tin cần thiết để thực giải thuật Để xác định giải thuậ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ấu trúc liệ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ả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 ứng, phù hợp Khi cấu trúc liệu thay đổi thường giải thuật phải thay đổi theo để tránh việc xử lý gượng ép, thiếu tự nhiên cấu trúc không phù hợp Hơn nữa, cấu trúc liệu tốt giúp giải thuậ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ải thuật dễ 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: 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ải thuậ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ải thuậ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ải thuậ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ải thuậ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ải thuậ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ải thuậ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ải thuậ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ải thuậ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úc liệu giải thuật”, ĐHSPKT Hưng Yên, Sách tham khảo: [2] Bộ môn CNPM, “Bài tập Cấu trúc liệu giải thuật”, ĐHSPKT Hưng Yên, 2006 [3] Đỗ Xuân Lôi, “Cấu trúc liệu giải thuật”, NXB ĐHQG, 2006 [4] Esakov J, “Bài tập nâng cao Cấu trúc liệ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úc liệu + Giải thuậ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

Ngày đăng: 24/10/2017, 15:49

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan