Cấu trúc dữ liệu và giải thuật
Cấu trúc liệu giải thuật Biên tập bởi: Khoa CNTT ĐHSP KT Hưng Yên Cấu trúc liệu giải thuật Biên tập bởi: Khoa CNTT ĐHSP KT Hưng Yên Các tác giả: Khoa CNTT ĐHSP KT Hưng Yên Phiên trực tuyến: http://voer.edu.vn/c/60bbf7d3 MỤC LỤC Giải thuật cấu trúc liệu Phân tích thiết kế tốn Phân tích thời gian thực thuật toán Mảng dánh sách Danh sách nối đơn (Singlely Linked List) Thực hành cài đặt danh sách nối đơn Danh sách tuyến tính ngăn xếp (Stack) Danh sách tuyến tính kiểu hàng đợi Thực hành đặt danh sách kiểu hàng đợi 10 Danh sách nối vòng nối kép 11 Thực hành cài đặt danh sách liên kết kép 12 Kiểu liệu 13 Thực hành cài đặt nhị phân 14 Cây nhị phân ứng dụng 15 Thực hành cài đặt nhị phân tìm kiếm 16 Kiểm tra thực hành tổng kết module Tham gia đóng góp 1/157 Giải thuật cấu trúc liệu GIẢI THUẬT 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: thích hợp cho nhiều máy tính Trong trường hợp nào, thìphương pháp, khơng phải 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 tố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 tốn tốt Thơng thường để giải tố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 q 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 tốn tiếng có từ thời cổ Hylạp thuật tốn Euclid (thuật tố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 tố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 tốn Euclid 2/157 MỐI QUAN HỆ GIỮA CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Thực đề án tin học chuyển tốn thực tế thành tốn giải máy tính Một tố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 tố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 tố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 ngồ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ý cịn 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 3/157 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 [ 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;for (int i=0; i info then insert (Right, x) else if x < info then insert (left, x); End; Giải thuật lặp Trong thủ tục ta sử dụng biến trỏ địa phương q chạy đỉnh gốc Khi đỉnh đó, q xuống đỉnh trái (phải) tuỳ theo khoá đỉnh lớn (nhỏ hơn) khoá x Ở đỉnh p muốn xuống đỉnh trái (phải) phải kiểm tra xem đỉnh có đỉnh trái (phải) khơng Nếu có tiếp tục xuống, ngược lại treo đỉnh vào bên trái (phải) đỉnh Điều kiện q = nil kết thúc vịng lặp Q trình lại lặp có đỉnh chèn vào procedure Insert (var Root : Tree; x: keytype) var p, q : tree; begin 145/157 New(p); P^.info :=x; if Root = nil then Begin Root:=p; P^.left:= nil; P^.right:= nil; End Else Begin q:=Root; while q nil if x < q^.info then if q^.left nil then q := q^.left else begin q^.left :=p; p := nil; end else if x > q^.info then if q^.right nil then q:=q^.right else begin q^.right :=p; 146/157 q =nil; end; end; end; Nhận xét: Để dựng CNPTK ứng với dãy khoá đưa vào cách liên tục bổ nút ứng với khoá, rỗng Ban đầu phải dựng lên với nút gốc khoá sau khố tiếp theo, tìm khơng có bổ sung vào Ví dụ với dãy khoá: 42 23 74 11 65 58 94 36 99 87 nhị phân tìm kiếm dựng có dạng hình 5.20 23744211366594589987 Hình 5.20 Một nhị phân tìm kiếm d)Loại bỏ nút nhị phân tìm kiếm Đối lập với phép tốn chèn vào phép toán loại bỏ Chúng ta cần phải loại bỏ khỏi CNPTK đỉnh có khố x (ta gọi tắt nút x) cho trước, cho việc huỷ nút khỏi phải bảo đảm điều kiện ràng buộc CNPTK Có ba trường hợp huỷ nút x xảy ra: • X nút • X nút nửa ( có trái phải) • X có đủ hai (trường hợp tổng quát) Trường hợp thứ nhất: đơn giản huỷ nút x không liên quan đến phần tử khác 320TCây trước xố20TCây sau xố Hình 5.21 Trường hợp thứ hai: Trước xố nút x cần móc nối cha x với nút (nút trái nút phải) T22010318T1 147/157 T2201025318T1 a) Cây trước xoáb) Cây sau xoá đỉnh (25) Trường hợp tổng quát: nút bị loại bỏ có trái phải, nút thay nút ứng với khố nhỏ sát trước (nút cực phải trái nó) nút ứng với khố lớn sát sau (nút cực trái phải nó) Như ta phải thay đổi số mối nối nút: • Nút cha nút bị loại bỏ • Nút chọn làm nút thay • Nút cha nút chọn làm nút thay T2b) Cây sau xoá đỉnh 201810253T1T2a) Cây trước xố đỉnh 20201025318T1 Trong ví dụ ta chọn nút thay nút bị xoá nút cực phải trái (nút 18) T5ABT4CET2T3T1RQTSa) Cây trước xoá nút trỏ QT5AEBT4CT2T1RQTST3b) Cây sau xoá nút trỏ Q Sau giải thuật thực việc loại bỏ nút trỏ Q Ban đầu Q nối trái nối phải nút R nhị phân tìm kiếm, mà ta giả sử biết procedure Del (var Q: Tree); {xoá nút trỏ Q} var T, S : Tree; begin P := Q; {Xử lý trường hợp nút nút nửa lá} if P^.left = nil then Begin Q:=P^.right ;{R^.left := P^.right} Dispose(P); end else if P^.right = nil then 148/157 begin Q :=P^.left; Dispore (P); end else { Xử lý trường hợp tổng quát} begin T := P^.left; if T^.right = nil then begin T^.right := P^.right; Q := T; Dispose (P); end else begin S := T^.right; {Tìm nút thay thế, nút cực phải } while S^.right nil begin T := S; S := T^.right; end; 149/157 S^.right := P^.right; T^.right := S^.left; S^.left := P^.left; Q:=S; Dispose(p); end; end; end; Thủ tục xố trường liệu X • Tìm đến nút có trường liệu X • Áp dụng thủ tục Del để xoá Sau viết thủ tục loại khỏi gốc Root đỉnh có khố x cho trước Đó thủ tục đệ qui, tìm đỉnh có khố x, sau áp dụng thủ tục Del để loại đỉnh khỏi procedure Delete (var Root :Tree ; x : keytype); begin if Root nil then if x < Root^.info then Delete (Root^.left, x) else if x > Root^.info then Delete (Root^.right, x) else Del(Root); end; Nhận xét: Việc huỷ tồn thực thơng qua thao tác duyệt theo thứ sau Nghĩa ta huỷ trái, phải huỷ nút gốc procedure RemoveTree (var Root: Tree); 150/157 begin if Root nil then begin RemoveTree(Root^.left); RemoveTree(Root^.right); Dispose (Root); end; end; 151/157 Thực hành cài đặt nhị phân tìm kiếm THỰC HÀNH CÀI ĐẶT CÂY NHỊ PHÂN TÌM KIẾM Cài đặt nhị phân tìm kiếm với phương thức: Khởi tạo Thêm nút Xóa nút Tìm kiếm 152/157 Kiểm tra thực hành tổng kết module KIỂM TRA THỰC HÀNH Chia nhóm tiến hành kiểm tra, đánh giá TỔNG KẾT MODUL Trao đổi tập, tập thực hành Hệ thống kiến thức modul học Mở rộng kiến thức môn học 153/157 Tham gia đóng góp Tài liệu: Cấu trúc liệu giải thuật Biên tập bởi: Khoa CNTT ĐHSP KT Hưng Yên URL: http://voer.edu.vn/c/60bbf7d3 Giấy phép: http://creativecommons.org/licenses/by/3.0/ Module: Giải thuật cấu trúc liệu Các tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://www.voer.edu.vn/m/8b6180c7 Giấy phép: http://creativecommons.org/licenses/by/3.0/ Module: Phân tích thiết kế toán Các tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://www.voer.edu.vn/m/32569f6a Giấy phép: http://creativecommons.org/licenses/by/3.0/ Module: Phân tích thời gian thực thuật tốn Các tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://www.voer.edu.vn/m/a7204439 Giấy phép: http://creativecommons.org/licenses/by/3.0/ Module: Mảng dánh sách Các tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://www.voer.edu.vn/m/9461a675 Giấy phép: http://creativecommons.org/licenses/by/3.0/ Module: Danh sách nối đơn (Singlely Linked List) Các tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://www.voer.edu.vn/m/578aa05e Giấy phép: http://creativecommons.org/licenses/by/3.0/ Module: Thực hành cài đặt danh sách nối đơn Các tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://www.voer.edu.vn/m/1038f94e 154/157 Giấy phép: http://creativecommons.org/licenses/by/3.0/ Module: Danh sách tuyến tính ngăn xếp (Stack) Các tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://www.voer.edu.vn/m/a208ce0f Giấy phép: http://creativecommons.org/licenses/by/3.0/ Module: Danh sách tuyến tính kiểu hàng đợi Các tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://www.voer.edu.vn/m/387652b5 Giấy phép: http://creativecommons.org/licenses/by/3.0/ Module: Thực hành đặt danh sách kiểu hàng đợi Các tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://www.voer.edu.vn/m/27f6f7c3 Giấy phép: http://creativecommons.org/licenses/by/3.0/ Module: Danh sách nối vòng nối kép Các tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://www.voer.edu.vn/m/556b338a Giấy phép: http://creativecommons.org/licenses/by/3.0/ Module: Thực hành cài đặt danh sách liên kết kép Các tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://www.voer.edu.vn/m/b1a9a363 Giấy phép: http://creativecommons.org/licenses/by/3.0/ Module: Kiểu liệu Các tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://www.voer.edu.vn/m/2ff63fcb Giấy phép: http://creativecommons.org/licenses/by/3.0/ Module: Thực hành cài đặt nhị phân Các tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://www.voer.edu.vn/m/a5c4789c Giấy phép: http://creativecommons.org/licenses/by/3.0/ 155/157 Module: Cây nhị phân ứng dụng Các tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://www.voer.edu.vn/m/58472201 Giấy phép: http://creativecommons.org/licenses/by/3.0/ Module: Thực hành cài đặt nhị phân tìm kiếm Các tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://www.voer.edu.vn/m/c00632bd Giấy phép: http://creativecommons.org/licenses/by/3.0/ Module: Kiểm tra thực hành tổng kết module Các tác giả: Khoa CNTT ĐHSP KT Hưng Yên URL: http://www.voer.edu.vn/m/a852a6eb Giấy phép: http://creativecommons.org/licenses/by/3.0/ 156/157 Chương trình Thư viện Học liệu Mở Việt Nam Chương trình Thư viện Học liệu Mở Việt Nam (Vietnam Open Educational Resources – VOER) hỗ trợ Quỹ Việt Nam Mục tiêu chương trình xây dựng kho Tài nguyên giáo dục Mở miễn phí người Việt cho người Việt, có nội dung phong phú Các nội dung đểu tuân thủ Giấy phép Creative Commons Attribution (CC-by) 4.0 nội dung sử dụng, tái sử dụng truy nhập miễn phí trước hết trong mơi trường giảng dạy, học tập nghiên cứu sau cho tồn xã hội Với hỗ trợ Quỹ Việt Nam, Thư viện Học liệu Mở Việt Nam (VOER) trở thành cổng thơng tin cho sinh viên giảng viên Việt Nam Mỗi ngày có hàng chục nghìn lượt truy cập VOER (www.voer.edu.vn) để nghiên cứu, học tập tải tài liệu giảng dạy Với hàng chục nghìn module kiến thức từ hàng nghìn tác giả khác đóng góp, Thư Viện Học liệu Mở Việt Nam kho tàng tài liệu khổng lồ, nội dung phong phú phục vụ cho tất nhu cầu học tập, nghiên cứu độc giả Nguồn tài liệu mở phong phú có VOER có chia sẻ tự nguyện tác giả ngồi nước Q trình chia sẻ tài liệu VOER trở lên dễ dàng đếm 1, 2, nhờ vào sức mạnh tảng Hanoi Spring Hanoi Spring tảng công nghệ tiên tiến thiết kế cho phép công chúng dễ dàng chia sẻ tài liệu giảng dạy, học tập chủ động phát triển chương trình giảng dạy dựa khái niệm học liệu mở (OCW) tài nguyên giáo dục mở (OER) Khái niệm chia sẻ tri thức có tính cách mạng khởi xướng phát triển tiên phong Đại học MIT Đại học Rice Hoa Kỳ vòng thập kỷ qua Kể từ đó, phong trào Tài nguyên Giáo dục Mở phát triển nhanh chóng, UNESCO hỗ trợ chấp nhận chương trình thức nhiều nước giới 157/157