Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 14 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
14
Dung lượng
509,08 KB
Nội dung
ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH Cấu trúc liệu giải thuật - CO2003 Bài tập lớn XÂY DỰNG CONCAT_STRING BẰNG CẤU TRÚC CÂY VÀ HASH Tác giả: Vũ Văn Tiến TP HỒ CHÍ MINH, THÁNG 10/2022 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH ĐẶC TẢ BÀI TẬP LỚN Phiên 1.0 Chuẩn đầu Sau hoàn thành tập lớn này, sinh viên ơn lại sử dụng thành thục: • Lập trình hướng đối tượng • Cấu trúc liệu nhị phân tìm kiếm AVL • Cấu trúc liệu Hash Dẫn nhập Trong Bài tập lớn 1, SV yêu cầu thực chuỗi ký tự cấu trúc liệu danh sách để giảm độ phức tạp thao tác nối chuỗi Cách thực có số hạn chế: thao tác truy cập ký tự vị trí có độ phức tạp cao; chuỗi tham gia vào thao tác nối lần Trong Bài tập lớn (BTL) này, sinh viên yêu cầu sử dụng cấu trúc Hash để thực chuỗi ký tự giải hạn chế Class biểu diễn cho chuỗi ký tự cần thực BTL có tên ConcatStringTree Mơ tả 3.1 Tổng quan Hình có minh hoạ chuỗi s1, s2 cấu trúc Với cấu trúc cây, thao tác nối chuỗi thực dễ dàng cách tạo node có trái s1 phải s2 Bên cạnh đó, để hỗ trợ thao tác truy cập vị trí, cấu trúc lựa chọn tìm kiếm nhị phân (Binary Search Tree) Key node chọn độ dài chuỗi bên trái Khi tìm kiếm (với vị trí xác định) node, vị trí tìm kiếm nhỏ key tiếp tục tìm kiếm bên trái, ngược lại tìm kiếm bên phải Bài tập lớn môn Cấu trúc liệu giải thuật - HK năm học 2022 - 2023 Trang 1/13 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH Với cách chọn key độ dài chuỗi bên trái ta key s3 (nối s1 với s2) Hình có giá trị Khi đó, thao tác để tìm key có độ phức tạp O(log(n)) (SV thử tìm cách tính độ phức tạp này) Để giảm độ phức tạp, ta lưu thêm thông tin tổng độ dài chuỗi node Hình đề xuất thông tin node biểu diễn s1 Hình 1: Minh hoạ thao tác nối chuỗi Hình 2: Minh hoạ node biểu diễn chuỗi Các phần sau mô tả chi tiết class cần thực BTL 3.2 class ConcatStringTree Các phương thức cần thực cho class ConcatStringTree: ConcatStringTree(const char * s) • Khởi tạo đối tượng ConcatStringTree với trường data trỏ đến đối tượng biểu diễn cho chuỗi ký tự liên tục có giá trị giống với chuỗi s • Độ phức tạp (mọi trường hợp): O(n) với n độ dài chuỗi s int length() const • Trả độ dài chuỗi lưu trữ đối tượng ConcatStringTree Bài tập lớn môn Cấu trúc liệu giải thuật - HK năm học 2022 - 2023 Trang 2/13 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH • Độ phức tạp (mọi trường hợp): O(1) Ví dụ 3.1 Trong Hình 1: – s1.length() trả – s2.length() trả char get(int index) const • Trả ký tự vị trí index • Ngoại lệ: Nếu index có giá trị vị trí khơng hợp lệ chuỗi, ném ngoại lệ (thông qua lệnh throw ngôn ngữ C++): out_of_range("Index of string is invalid!") index có giá trị vị trí hợp lệ index nằm đoạn [0, l − 1] với l độ dài chuỗi • Độ phức tạp (trường hợp trung bình): O(log(k)) với k số lượng node ConcatStringTree Ví dụ 3.2 Trong Hình 1: – s1.get(14) ném ngoại lệ out_of_range("Index of string is invalid!") – s2.get(1) trả ký tự ’i’ int indexOf(char c) const • Trả vị trí xuất c ConcatStringTree Nếu không tồn ký tự c trả giá trị -1 • Độ phức tạp (trường hợp tệ nhất): O(l) với l chiều dài chuỗi ConcatStringTree Ví dụ 3.3 Trong Hình 1: – s1.indexOf(’i’) trả -1 – s2.indexOf(’i’) trả string toStringPreOrder() const • Trả chuỗi biểu diễn cho đối tượng ConcatStringTree duyệt node cách Bài tập lớn môn Cấu trúc liệu giải thuật - HK năm học 2022 - 2023 Trang 3/13 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH tiền thứ tự NLR • Độ phức tạp (mọi trường hợp): O(l) với l chiều dài chuỗi ConcatStringTree Ví dụ 3.4 Trong Hình 1: – s1.toStringPreOrder() trả "ConcatStringTree[(LL=5,L=8,);(LL=0,L=5,"Hello");(LL=0,L=3,",_t")]" string toString() const • Trả chuỗi biểu diễn cho đối tượng ConcatStringTree • Độ phức tạp (mọi trường hợp): O(l) với l chiều dài chuỗi ConcatStringTree Ví dụ 3.5 Trong Hình 1: – s1.toString() trả "ConcatStringTree["Hello,_t"]" – s2.toString() trả "ConcatStringTree["his_is_an"]" ConcatStringTree concat(const ConcatStringTree & otherS) const • Trả đối tượng ConcatStringTree mô tả Mục 3.1 • Độ phức tạp (mọi trường hợp): O(1) • Ví dụ: Xem lại Hình ConcatStringTree subString(int from, int to) const • Trả đối tượng ConcatStringTree chứa ký tự vị trí from (bao gồm from) đến vị trí to (khơng bao gồm to) • Ngoại lệ: Nếu from to vị trí khơng hợp lệ chuỗi ném ngoại lệ out_of_range("Index of string is invalid!") Nếu f rom >= to ném ngoại lệ logic_error("Invalid range!") • Ví dụ: Hình minh hoạ cho thao tác subString • Lưu ý: Chuỗi cần tạo node (không sử dụng lại node gốc) cố gắng giữ lại liên kết node giống gốc ConcatStringTree reverse() const Bài tập lớn môn Cấu trúc liệu giải thuật - HK năm học 2022 - 2023 Trang 4/13 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH Hình 3: Minh hoạ chuỗi sau thực thao tác subString • Trả đối tượng ConcatStringTree biểu diễn chuỗi nghịch đảo chuỗi gốc • Ví dụ: Hình minh hoạ thao tác reverse Hình 4: Minh hoạ thao tác reverse 10 ∼ConcatStringTree() • Hiện thực hàm huỷ để tất vùng nhớ cấp phát động phải thu hồi sau chương trình kết thúc Xem xét s1 Hình 1, thơng thường, xố s1 node chứa chuỗi "Hello" ",_r" bị xố Điều khơng phù hợp chuỗi cần đến cho tạo thành chuỗi Tham khảo Mục 3.3 để thực hàm hủy cho phù hợp Bài tập lớn môn Cấu trúc liệu giải thuật - HK năm học 2022 - 2023 Trang 5/13 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH 3.3 class ParentsTree Xem xét lại Hình minh hoạ kết thao tác nối chuỗi Khi muốn xố s1, ta xố tồn node s1 làm chuỗi "Hello" ",_r" Từ làm thơng tin để biểu diễn cho s3 Để giải vấn đề này, node, ta lưu trữ node cha liền kề có trỏ đến node Khi thực xố qua node, ta kiểm tra node khơng có node cha thực xố node node Sinh viên yêu cầu sử dụng cấu trúc AVL để lưu trữ thông tin node cha node ConcatStringTree Để sử dụng AVL, ta cần chọn key tương ứng cho node SV cần thực chế sinh id đơn giản dùng id làm key cho node Cơ chế sinh id sau: • Node tạo có id giá trị • Các node sau sinh có id với id lớn cấp trước cộng thêm • Id cấp tối đa 107 giá trị Nếu id cấp cho node lớn 107 , ném ngoại lệ overflow_error("Id is overflow!") Class ParentsTree biểu diễn AVL dùng để lưu trữ node cha node Trong ParentsTree, thực thao tác xố node node có trái phải, ta lấy node lớn bên trái để thay cho node Khi xoá node ConcatStringTree ta xố thơng tin node khỏi ParentsTree node gốc thuộc bên trái node gốc thuộc bên phải Nếu ParentsTree node rỗng node khơng sử dụng để tạo thành lớn hơn, ta xố node node Mặt khác, Hình 1, xố s3 (trước s1 s2) xố s1 s2, thơng tin biểu diễn cho s1 s2 bị Để giải vấn đề này, ta thêm giá trị vào ParentsTree để q trình xố s3 truyền đến s1 ParentsTree khơng bị rỗng khơng tiếp tục q trình xố Cụ thể, tạo node ConcatStringTree, ta thêm id node vào ParentsTree Đồng thời, sinh viên cần lưu ý cập nhật vào ParentsTree lần thực nối chuỗi SV cần thực phương thức sau cho class ParentsTree (đây phương thức sử dụng testcases, SV tự thực phương thức khác cần): int size() const • Trả số node ParentsTree • Độ phức tạp: O(1) Bài tập lớn môn Cấu trúc liệu giải thuật - HK năm học 2022 - 2023 Trang 6/13 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH Ví dụ 3.6 Trong Hình 1: – Gọi size() với đối tượng ParentsTree node gốc s1 trả – Gọi size() với đối tượng ParentsTree node có data "Hello" s1 trả string toStringPreOrder() const • Trả chuỗi biểu diễn cho đối tượng ParentsTree duyệt node theo thứ tự tiền tố NLR Chuỗi biểu diễn có định dạng sau: "ParentsTree[]" Với danh sách node phân cách ký tự chấm phẩy Định dạng node là: "(id=)" Với id node Ví dụ 3.7 Ví dụ kết thao tác toStringPreOrder() có • node (rỗng): "ParentsTree[]" • node: "ParentsTree[(id=1)]" • node: "ParentsTree[(id=2);(id=3)]" SV phải thực thêm phương thức sau cho class ConcatStringTree: int getParTreeSize(const string & query) const • Trả số lượng node ParentsTree node xác định ConcatStringTree • Chuỗi query dùng để xác định node muốn truy cập ParentsTree query gồm ký tự thuộc ký tự ’l’ ’r’, ngược lại ném ngoại lệ: runtime_error("Invalid character of query") Cách xác định dựa vào query: Ban đầu ta node gốc ConcatStringTree Lần lượt duyệt qua ký tự query, gặp ký tự ’l’, ta di chuyển đến bên trái, gặp ký tự ’r’, ta di chuyển đến bên phải Nếu trình thực hiện, ta gặp địa NULL ném ngoại lệ: runtime_error("Invalid query: reaching NULL") Bài tập lớn môn Cấu trúc liệu giải thuật - HK năm học 2022 - 2023 Trang 7/13 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH string getParTreeStringPreOrder(const string & query) const • Trả chuỗi biểu diễn cho đối tượng ParentsTree node xác định ConcatStringTree Chuỗi biểu diễn kết trả phương thức toStringPreOrder class ParentsTree • Chuỗi query dùng để xác định node muốn truy cập ParentsTree Quy tắc cách truy cập query giống mô tả phương thức getParTreeSize 3.4 class ReducedConcatStringTree class LitStringHash Xem xét Hình 5, chuỗi s1 s2 đối tượng class ConcatStringTree Ta thấy chuỗi "hello" xuất lần: bên trái s1 bên phải s2 Trong mục này, ta tìm cách giảm kích thước lưu trữ chuỗi cách trỏ liệu đến vùng nhớ tồn chuỗi tạo giống với chuỗi tạo (như chuỗi s2) Class biểu diễn chuỗi với khả giảm vùng nhớ lưu trữ gọi ReducedConcatStringTree ReducedConcatStringTree cần có tất thuộc tính phương thức class ConcatStringTree Gọi chuỗi chứa liệu thật LitString Trong hình 5, "hello", "there", "here" LitString; node node LitString Ta dùng cấu trúc Hash lưu trữ LitString, gọi class biểu diễn cấu trúc LitStringHash • Khi chuỗi tạo ra, LitString tồn LitStringHash ta trỏ data đến địa LitString (không tạo LitString mới) Ngược lại, LitString chưa tồn LitStringHash ta thêm (insert) LitString vào LitStringHash Mỗi LitString LitStringHash nên có thêm thơng tin số liên kết đến • Khi xố chuỗi, LitString khơng cịn liên kết đến ta xố khỏi LitStringHash Nếu sau xố LitStringHash trở thành rỗng ta cần thu hồi vùng nhớ cấp phát cho LitStringHash Ở thao tác sau (nếu có), ta cần cấp phát lại vùng nhớ cho LitStringHash Class LitStringHash có đặc điểm sau: • Giả sử s LitString Hàm băm LitStringHash sau: h(s) = s[0] + s[1] ∗ p + s[2] ∗ p2 + + s[n − 1] ∗ pn−1 mod m Trong đó: – n chiều dài chuỗi Bài tập lớn môn Cấu trúc liệu giải thuật - HK năm học 2022 - 2023 Trang 8/13 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH Hình 5: Minh hoạ giảm vùng nhớ cho chuỗi – s[0], s[1], , s[n-1] số nguyên biễu diễn mã ASCII tương ứng ký tự vị trí 0, 1, , n-1 – m kích thước bảng hash – p thơng số cấu hình mơ tả sau • Hàm dị tìm: sử dụng phương pháp dị tìm bậc (quadratic probing): hp(s, i) = (h(s) + c1 ∗ i + c2 ∗ i2 ) mod m Trong đó: – m kích thước bảng hash – c1, c2 thơng số cấu hình mơ tả sau Lưu ý: Nếu khơng tìm thấy vị trí trống để thêm vào ném ngoại lệ: runtime_error("No possible slot") Bài tập lớn môn Cấu trúc liệu giải thuật - HK năm học 2022 - 2023 Trang 9/13 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH • Rehashing: Sau thêm giá trị vào LitStringHash, LitStringHash có hệ số tải (load factor) lớn lambda ta cần thực rehash Hệ số tải tính tỉ lệ số phần tử có kích thước LitStringHash lambda thơng số cấu hình Các bước thực rehash: – Tạo LitStringHash với kích thước alpha ∗ size (làm trịn xuống) với size kích thước LitStringHash – Lần lượt lặp qua vị trí LitStringHash, vị trí có LitString ta chèn vào LitStringHash • Class HashConfig: class chứa thơng số cấu hình cho thao tác trên, gồm có: – p: số nguyên sử dụng hàm băm – c1, c2: số thực (kiểu double) sử dụng hàm dị tìm – lambda: số thực (kiểu double) thể tỉ lệ mà hệ số tải lớn thực rehashing – alpha: số thực (kiểu double) thể tỉ lệ nhân với kích thước cũ để tạo kích thước lớn – initSize: số nguyên, thể kích thước LitStringHash vừa khởi tạo thêm giá trị sau vừa thu hồi vùng nhớ cho LitStringHash SV cần thực phương thức sau cho class LitStringHash: LitStringHash(const HashConfig & hashConfig) • Nhận vào đối tượng hashConfig khởi tạo tham số cấu hình cần thiết cho thao tác băm int getLastInsertedIndex() const • Trả vị trí cuối thêm vào LitStringHash sau thao tác rehash thực (nếu có) Nếu trước chưa có phần tử chèn, vừa thực thu hồi vùng nhớ cho LitStringHash trả giá trị -1 • Độ phức tạp (mọi trường hợp): O(1) string toString() const • Trả chuỗi biểu diễn cho đối tượng LitStringHash Chuỗi biểu diễn có định dạng sau: "LitStringHash[]" Với danh sách phần tử phân cách ký tự chấm phẩy Định dạng phần tử là: Bài tập lớn môn Cấu trúc liệu giải thuật - HK năm học 2022 - 2023 Trang 10/13 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH – Nếu vị trí khơng có giá trị: "()" – Nếu vị trí có giá trị: "(litS=)" Với chuỗi biểu diễn LitString Ví dụ 3.8 Ví dụ kết thao tác toString() – "LitStringHash[();(litS="Hello");();(litS="there")]" SV cần thực phương thức sau cho class ReducedConcatStringTree: ReducedConcatStringTree(const char * s, LitStringHash * litStringHash) • Khởi tạo đối tương ReducedConcatStringTree với trường data trỏ đến đối tượng biểu diễn cho chuỗi ký tự liên tục có giá trị giống với chuỗi s (giống phương thức khởi tạo ConcatStringTree) Đồng thời, khởi tạo trỏ đến đối tượng LitStringHash Đối tượng lưu trữ thông tin bảng băm dùng chung cho đối tượng ReducedConcatStringTree • Độ phức tạp (mọi trường hợp): O(n) với n độ dài chuỗi s 3.5 Yêu cầu Để hoàn thành tập lớn này, sinh viên phải: Đọc toàn tập tin mô tả Tải xuống tập tin initial.zip giải nén Sau giải nén, sinh viên nhận tập tin: main.cpp, main.h, ConcatStringTree.h, ConcatStringTree.cpp thư mục sample_output Sinh viên nộp tập tin ConcatStringTree.h ConcatStringTree.cpp nên không sửa đổi tập tin main.h chạy thử chương trình Sinh viên sử dụng câu lệnh sau để biên dịch: g++ -o main main.cpp ConcatStringTree.cpp -I -std=c++11 Câu lệnh dùng command prompt/terminal để biên dịch chương trình Nếu sinh viên dùng IDE để chạy chương trình, sinh viên cần ý: thêm đầy đủ tập tin vào project/workspace IDE; thay đổi lệnh biên dịch IDE cho phù hợp IDE thường cung cấp nút (button) cho việc biên dịch (Build) chạy chương trình (Run) Khi nhấn Build IDE chạy câu lệnh biên dịch tương ứng, thông thường, biên Bài tập lớn môn Cấu trúc liệu giải thuật - HK năm học 2022 - 2023 Trang 11/13 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH dịch file main.cpp Sinh viên cần tìm cách cấu hình IDE để thay đổi lệnh biên dịch: thêm file ConcatStringTree.cpp, thêm option -std=c++11, -I Chương trình chấm tảng Unix Nền tảng trình biên dịch sinh viên khác với nơi chấm thực tế Nơi nộp BKeL cài đặt giống với nơi chấm thực tế Sinh viên phải chạy thử chương trình nơi nộp phải sửa tất lỗi xảy nơi nộp BKeL để có kết chấm thực tế Sửa đổi file ConcatStringTree.h, ConcatStringTree.cpp để hoàn thành tập lớn đảm bảo hai yêu cầu sau: • Tất phương thức mô tả phải thực để việc biên dịch thực thành công Nếu sinh viên chưa thể thực phương thức nào, cung cấp thực rỗng cho phương thức Mỗi testcase gọi số phương thức mô tả để kiểm tra kết trả • Chỉ có lệnh include tập tin ConcatStringTree.h #include "main.h" include tập tin ConcatStringTree.cpp #include "ConcatStringTree.h" Ngồi ra, khơng cho phép có #include khác tập tin Sinh viên phép viết thêm phương thức thuộc tính khác class yêu cầu thực Sinh viên yêu cầu thiết kế sử dụng cấu trúc liệu dựa loại danh sách học Sinh viên phải giải phóng tồn vùng nhớ xin cấp phát động chương trình kết thúc Nộp Sinh viên nộp tập tin: ConcatStringTree.h ConcatStringTree.cpp, trước thời hạn đưa đường dẫn "Assignment - Submission" Có số testcase đơn giản sử dụng để kiểm tra làm sinh viên nhằm đảm bảo kết sinh viên biên dịch chạy Sinh viên nộp lần tùy ý có nộp cuối tính điểm Vì hệ thống chịu tải nhiều sinh viên nộp lúc, sinh viên nên nộp sớm tốt Sinh viên tự chịu rủi ro nộp sát hạn chót Khi thời hạn nộp bài, hệ thống đóng nên sinh viên nộp Bài nộp qua phương thức khác không chấp nhận Bài tập lớn môn Cấu trúc liệu giải thuật - HK năm học 2022 - 2023 Trang 12/13 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH Một số quy định khác • Sinh viên phải tự hồn thành tập lớn phải ngăn không cho người khác đánh cắp kết Nếu khơng, sinh viên bị xử lý theo quy định trường gian lận • Mọi định giảng viên phụ trách tập lớn định cuối • Sinh viên không cung cấp testcase sau chấm mà cung cấp thông tin chiến lược thiết kế testcase phân bố số lượng sinh viên theo testcase • Nội dung Bài tập lớn Harmony với câu hỏi kiểm tra với nội dung tương tự Bài tập lớn môn Cấu trúc liệu giải thuật - HK năm học 2022 - 2023 Trang 13/13 ... chuỗi lưu trữ đối tượng ConcatStringTree Bài tập lớn môn Cấu trúc liệu giải thuật - HK năm học 20 22 - 20 23 Trang 2/ 13 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH • Độ phức... NULL") Bài tập lớn môn Cấu trúc liệu giải thuật - HK năm học 20 22 - 20 23 Trang 7/13 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH string getParTreeStringPreOrder(const string. .. node giống gốc ConcatStringTree reverse() const Bài tập lớn môn Cấu trúc liệu giải thuật - HK năm học 20 22 - 20 23 Trang 4/13 TRƯỜNG ĐẠI HỌC BÁCH KHOA - ĐHQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH