Xây dựng concat string bằng danh sách (cấu trúc dữ liệu và giải thuật co200)

13 1 0
Xây dựng concat string bằng danh sách (cấu trúc dữ liệu và giải thuật co200)

Đ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

lOMoARcPSD|22494228 Ạ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 DANH SÁCH Tác giả: Vũ Văn Tiến TP HỒ CHÍ MINH, THÁNG 08/2022 lOMoARcPSD|22494228 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ác cấu trúc liệu danh sách • Giải thuật xếp Dẫn nhập Chuỗi ký tự (string) thường ược sử dụng ể biểu diễn cho oạn văn bản, từ ó hiển thị thơng tin có ý nghĩa ến người dùng Thơng thường, chuỗi ký tự ược thực cách sử dụng danh sách ặc ể lưu trữ ký tự liền kề Tuy nhiên, với cách lưu trữ mảng ặc, thao tác nối (operation concatenate/join) chuỗi có ộ dài m n có ộ phức tạp O(m + n) Mặt khác, danh sách liên kết cấu trúc liệu thực thao tác nối danh sách với ộ phức tạp thấp Trong tập lớn này, sinh viên ược yêu cầu thực lớp chuỗi ký tự hỗ trợ thao tác nối chuỗi cách hiệu sử dụng cấu trúc liệu danh sách (trong BTL sau ây gọi chuỗi hỗ trợ thao tác nối ConcatStringList) 3.1 Mô tả Tổng quan Hình biểu diễn cách thực ConcatStringList ConcatStringList s1 có CharALNode, CharALNode có thơng tin: chuỗi ký tự liên kết ến CharALNode Chuỗi ký tự ược lưu CharArrayList, ây danh sách ặc (Array List) chứa ký tự chuỗi, danh sách giúp thao tác truy cập ký tự vị trí ngẫu nhiên hiệu 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/12 lOMoARcPSD|22494228 TRƯỜNG ẠI HỌC BÁCH KHOA - HQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH Hình 1: Tổng quan cách biểu diễn chuỗi ký tự Mặt khác, thao tác nối chuỗi ược thực hiệu cách nối liên kết CharALNode cuối chuỗi trước với CharALNode ầu tiên chuỗi sau Ví dụ: Hình 1, thực nối chuỗi s1 với s2, ta chß cần trỏ liên kết CharALNode "is_is" ến CharALNode "_an" Kết phép nối ược biểu diễn Hình Hình 2: Kết phép nối chuỗi Các phần sau mô tả chi tiết class cần ược thực 3.2 class ConcatStringList (6 iểm) Các phương thức cần thực cho class ConcatStringList: ConcatStringList(const char * s) • Khởi tạo ối tượng ConcatStringList với CharALNode, CharALNode có CharArrayList ược khởi tạo chuỗi s • ộ phức tạp (mọi trường hợp): O(n) với n ộ dài chuỗi s 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/12 lOMoARcPSD|22494228 TRƯỜNG ẠI HỌC BÁCH KHOA - HQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH int length() const • Trả ộ dài chuỗi ang ược lưu trữ ối tượng ConcatStringList • ộ phức tạp (mọi trường hợp): O(1) Ví dụ 3.1 Trong Hình 1: s1.length() trả 14 s2.length() trả 3 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 tệ nhất): O(k) với k số lượng CharALNode ConcatStringList 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ự ’a’ int indexOf(char c) const • Trả vị trí xuất ầu tiên c ConcatStringList 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 ConcatStringList Ví dụ 3.3 Trong Hình 1: s1.indexOf(’i’) trả s2.indexOf(’b’) trả -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 Downloaded by vu hi (vuchinhhp6@gmail.com) Trang 3/12 lOMoARcPSD|22494228 TRƯỜNG ẠI HỌC BÁCH KHOA - HQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH string toString() const • Trả chuỗi biểu diễn cho ối tượng ConcatStringList • ộ phức tạp (mọi trường hợp): O(l) với l chiều dài chuỗi ConcatStringList Ví dụ 3.4 Trong Hình 1: s1.toString() trả "ConcatStringList["Hello,_this_is"]" s2.toString() trả "ConcatStringList["_an"]" ConcatStringList concat(const ConcatStringList & otherS) const • Trả ối tượng ConcatStringList thực trỏ liên kết CharALNode cuối ối tượng ến CharALNode ầu tiên ối tượng otherS • ộ phức tạp (mọi trường hợp): O(1) • Ví dụ: Hình biểu diễn chuỗi trước sau thực phép nối • Lưu ý: class ConcatStringList cần ảm bảo có hai trỏ ến CharALNode ầu cuối Hai trỏ ược sử dụng số yêu cầu sau BTL • Lưu ý 2: ể tránh số trường hợp node xóa theo mục 3.3, testcases ảm bảo thao tác concat chß thực chuỗi không ược tạo concat, chuỗi ược tạo hàm khởi tạo chß tham gia vào thao tác concat Hình 3: Minh hoạ chuỗi trước thực phép nối ConcatStringList subString(int from, int to) 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 Downloaded by vu hi (vuchinhhp6@gmail.com) Trang 4/12 lOMoARcPSD|22494228 TRƯỜNG ẠI HỌC BÁCH KHOA - HQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH Hình 4: Minh hoạ chuỗi sau thực phép nối • Trả ối tượng ConcatStringList chứa ký tự bắt ầu 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 ý: ể thực yêu cầu mục 3.3, ảm bảo khớp kết testcase chấm iểm, chuỗi cần tạo CharALNode (không sử dụng lại chuỗi gốc) có cấu trúc liên kết giống chuỗi gốc (hình giữ lại liên kết node, thay gộp thành node "lo,_") Hình 5: Minh hoạ chuỗi sau thực phép subString 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 Downloaded by vu hi (vuchinhhp6@gmail.com) Trang 5/12 lOMoARcPSD|22494228 TRƯỜNG ẠI HỌC BÁCH KHOA - HQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH ConcatStringList reverse() const • Trả ối tượng ConcatStringList 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 6: Minh hoạ thao tác reverse ∼ConcatStringList() • Hiện thực hàm huÿ ể tất vùng nhớ ược cấp phát ộng phải ược thu hồi sau chương trình kết thúc Một hàm huÿ thông thường thu hồi CharALNode nằm head tail iều khơng phù hợp số CharALNode cịn tham khảo ến kết thao tác nối chuỗi Tham khảo thêm Mục 3.3 ể thực hàm huÿ cho phù hợp 3.3 class ReferencesList class DeleteStringList (4 iểm) Xem xét lại Hình minh hoạ kết thao tác nối Giả sử ta muốn thực xoá chuỗi s2, CharALNode "_an" bị xố chuỗi s4 chß cịn CharALNode khơng cịn biểu diễn úng kết thao tác nối chuỗi ể giải vấn ề này, ta trì danh sách số lượng tham khảo ến CharALNode ầu cuối, ược biểu diễn class ReferencesList Ví dụ: Hình 4, CharALNode "is_is" có số lượng tham khảo ến (từ tail s1), CharALNode "_an" có số lượng tham khảo ồng thời, ta trì danh sách chuỗi ã ược xoá, ược biểu diễn class DeleteStringList Mỗi node DeleteStringList 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 Downloaded by vu hi (vuchinhhp6@gmail.com) Trang 6/12 lOMoARcPSD|22494228 TRƯỜNG ẠI HỌC BÁCH KHOA - HQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH giữ thông tin CharALNode ầu cuối chuỗi ã ược xố Ta duyệt tồn danh sách này, kiểm tra head tail có tổng số lượng tham khảo thực xoá CharALNode nằm head tail (bao gồm head tail) Sau ây số yêu cầu thực class ReferencesList class DeleteStringList: • Mỗi có chuỗi ược tạo ra, CharALNode ầu cuối chuỗi ược thêm vào ReferencesList ể theo dõi Trong phương thức ược yêu cầu thực cho class ConcatStringList, phương thức sau tạo ối tượng mới: ConcatStringList(const char *) ConcatStringList concat(const ConcatStringList & otherS) const ConcatStringList subString(int from, int to) const ConcatStringList reverse() const • Mỗi xoá chuỗi, ta giảm số lượng tham khảo ReferencesList tương ứng với CharALNode head tail chuỗi xuống ơn vị ồng thời, thêm node gồm thông tin head tail vào cuối DeleteStringList Sau ó, ta duyệt qua node DeleteStringList, node có tổng số lượng tham khảo ến head tail ta xố CharALNode nằm head tail, sau ó xoá node khỏi DeleteStringList Nếu phần tử ReferencesList ều có tổng 0, ta xóa tất node ReferencesList Lưu ý, xoá CharALNode nằm head tail, cần kiểm tra head tail ã bị xố trước ó hay chưa • Khi thực xoá chuỗi, ta cần quan tâm ến CharALNode mà có số tham khảo thấp Vì sau giảm số tham khảo xảy trường hợp số lượng tham khảo chúng (kéo theo việc ta phải xóa CharALNode theo mơ tả trên) ể cải thiện hiệu tìm kiếm ReferencesList, ta ln trì thứ tự khơng giảm danh sách Với thứ tự ó, node có số lượng tham khảo ầu danh sách Tuy nhiên, node khơng cịn cần thiết cho việc tìm kiếm Do vậy, node có số lượng tham khảo cần nằm cuối ReferencesList Xem thêm Hình 7, 8, minh hoạ ReferenceList DeleteStringList qua bước xố chuỗi Lưu ý: Hình 9, DeleteStringList chưa minh hoạ kết cuối Vì số lượng tham khảo ến "_world" nên node ầu tiên DeleteStringList (gồm "no references of s1 head" "no references of s1 tail") bị xố DeleteStringList sau ó chß có node Các phương thức cần thực cho class ReferenceList: int size() const • Trả số node danh sách tham khảo 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 Downloaded by vu hi (vuchinhhp6@gmail.com) Trang 7/12 lOMoARcPSD|22494228 TRƯỜNG ẠI HỌC BÁCH KHOA - HQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH Hình 7: Minh hoạ ReferenceList Hình 8: Minh hoạ ReferenceList sau xố s2 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 Downloaded by vu hi (vuchinhhp6@gmail.com) Trang 8/12 lOMoARcPSD|22494228 TRƯỜNG ẠI HỌC BÁCH KHOA - HQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH Hình 9: Minh hoạ ReferenceList sau xố s4 • ộ phức tạp: O(1) Ví dụ 3.5 Gọi size() với danh sách tham khảo Hình trả 2 int refCountAt(int index) const • Trả số lượng ứng với tham khảo vị trí index • Ngoại lệ: Nếu index có giá trị vị trí khơng hợp lệ, ném ngoại lệ: out_of_range("Index of references list is invalid!") Ví dụ 3.6 Gọi refCountAt(1) với danh sách tham khảo Hình trả Gọi refCountAt(0) với danh sách tham khảo Hình trả string refCountsString() const • Trả chuỗi biểu diễn số lượng tham khảo danh sách tham khảo • ộ phức tạp: O(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 Downloaded by vu hi (vuchinhhp6@gmail.com) Trang 9/12 lOMoARcPSD|22494228 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.7 Gọi refCountsString() với danh sách tham khảo Hình trả "RefCounts[1,3]" Gọi refCountsString() với danh sách tham khảo Hình trả "RefCounts[2]" Các phương thức cần thực cho class DeleteStringList: int size() const • Trả số node danh sách • ộ phức tạp: O(1) Ví dụ 3.8 Gọi size() với DeleteStringList Hình trả Gọi size() với DeleteStringList Hình trả string totalRefCountsString() const • Trả chuỗi biểu diễn tổng số lượng tham khảo node • ộ phức tạp: O(n) Ví dụ 3.9 Gọi totalRefCountsString() với danh sách Hình trả về: "TotalRefCounts[1]" Gọi totalRefCountsString() với danh sách Hình trả về: "TotalRefCounts[2]" 3.4 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 ược tập tin: main.cpp, main.h, ConcatStringList.h, ConcatStringList.cpp thư mục sample_output Sinh viên chß nộp tập tin ConcatStringList.h ConcatStringList.cpp nên không ược sửa ổi tập tin main.h chạy thử chương trình 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 Downloaded by vu hi (vuchinhhp6@gmail.com) Trang 10/12 lOMoARcPSD|22494228 TRƯỜNG ẠI HỌC BÁCH KHOA - HQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH Sinh viên sử dụng câu lệnh sau ể biên dịch: g++ -o main main.cpp ConcatStringList.cpp -I -std=c++11 Câu lệnh ược 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, chß biên dịch phải 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 ConcatStringList.cpp, thêm option -std=c++11, -I Chương trình ược 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 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ó úng kết chấm thực tế Sửa ổi file ConcatStringList.h, ConcatStringList.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ả ều phải ược thực ể việc biên dịch ược thực thành công Nếu sinh viên chưa thể thực ượ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ả  kim tra kt qu tr v ã Chò cú lệnh include tập tin ConcatStringList.h #include "main.h" include tập tin ConcatStringList.cpp #include "ConcatStringList.h" Ngồi ra, khơng cho phép có #include khác tập tin Trong tập tin main.cpp có cung cấp số testcases ơn giản hàm có ịnh dạng "tc()" Kết chạy hàm "tc()" ược ghi lại tập tin "tc.txt" thưc mục sample_output Sinh viên ược phép viết thêm phương thức thuộc tính khác class ược yêu cầu thực Sinh viên ược 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 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 Downloaded by vu hi (vuchinhhp6@gmail.com) Trang 11/12 lOMoARcPSD|22494228 TRƯỜNG ẠI HỌC BÁCH KHOA - HQG-HCM KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH Nộp Sinh viên chß nộp tập tin: ConcatStringList.h ConcatStringList.cpp, trước thời hạn ược ưa ường dẫn "Assignment - Submission" Có số testcase ơn giản ược 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 ược Sinh viên nộp lần tùy ý chß có nộp cuối ược tính iểm Vì hệ thống khơng thể chịu tải q 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 khơng thể nộp Bài nộp qua phương thức khác ều không ược chấp nhận 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 ược cung cấp testcase sau chấm mà chß ược cung cấp thông tin chiến lược thiết kế testcase phân bố số lượng sinh viên úng theo testcase • Nội dung Bài tập lớn ược Harmony với câu hỏi kiểm tra với nội dung tương tự Thay ổi so với phiên trước • Bổ sung phần "Lưu ý" cho phương thức ConcatStringList subString(int from, int to) const ã Chònh sa ỏp án ví dụ 3.9 mơ tả phương thức string totalRefCountsString() const ã Chònh sa iu kin dn n vic xóa tất node ReferencesList mục 3.3 • Bổ sung phần "Lưu ý 2" cho phương thức ConcatStringList concat(const ConcatStringList & otherS) 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 Downloaded by vu hi (vuchinhhp6@gmail.com) Trang 12/12

Ngày đăng: 22/06/2023, 20:44

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

Tài liệu liên quan