Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 13 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
13
Dung lượng
687,64 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 DANH SÁCH Tác giả: Vũ Văn Tiến TP HỒ CHÍ MINH, THÁNG 08/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 hồ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 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ự 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 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 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ự lưu CharArrayList, 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 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 thực hiệu cách nối liên kết CharALNode cuối chuỗi trước với CharALNode chuỗi sau Ví dụ: Hình 1, thực nối chuỗi s1 với s2, ta cần trỏ liên kết CharALNode "is_is" đến CharALNode "_an" Kết phép nối 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 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 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 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 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 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 Trang 3/12 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 đố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ỏ 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 thực chuỗi không tạo concat, chuỗi tạo hàm khởi tạo 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 Trang 4/12 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ự 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 Trang 5/12 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ấp phát động phải 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 cịn CharALNode khơng cịn biểu diễn 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, 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 xoá, 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 Trang 6/12 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 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 số yêu cầu thực class ReferencesList class DeleteStringList: • Mỗi có chuỗi tạo ra, CharALNode đầu cuối chuỗi thêm vào ReferencesList để theo dõi Trong phương thứ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 xố 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 xố node khỏi DeleteStringList Nếu phần tử ReferencesList 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 DeleteStringList (gồm "no references of s1 head" "no references of s1 tail") bị xố DeleteStringList sau 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 Trang 7/12 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 Trang 8/12 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 Trang 9/12 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 tồ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, ConcatStringList.h, ConcatStringList.cpp thư mục sample_output Sinh viên nộp tập tin ConcatStringList.h ConcatStringList.cpp nên không 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 Trang 10/12 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 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 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 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 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ả 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 ConcatStringList.h #include "main.h" include tập tin ConcatStringList.cpp #include "ConcatStringList.h" Ngoà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()" ghi lại tập tin "tc.txt" thưc mục sample_output 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 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/12 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 nộp tập tin: ConcatStringList.h ConcatStringList.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 khơng thể 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 khơng thể nộp Bài nộp qua phương thức khác không 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 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ự 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 sửa đáp án ví dụ 3.9 mơ tả phương thức string totalRefCountsString() const • Chỉnh sửa điều kiện dẫn đến việc 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 Trang 12/12