Nén và giải nén dữ liệu bằng cây HuffmanCode C++ chuẩn

5 1.8K 16
Nén và giải nén dữ liệu bằng cây HuffmanCode C++ chuẩn

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

Thông tin tài liệu

Khoa Khoa học Kỹ thuật máy tính Bộ môn Khoa học máy tính Bài tập lớn Version: 1.00 I- Giới thiệu Trong tập lớn này, sinh viên lập trình cho toán cụ thể Các kiến thức sau sử dụng tập lớn: - Tree, binary tree Heap String Thao tác bit Ở tập lớn này, sinh viên yêu cầu hoàn thiện chương trình nén giải nén cho liệu text, chi tiết mục II II- Mô tả Bài toán Trong thực tế sử dụng máy tính, thường xuyên làm việc với lượng lớn liệu, thông thường, để lưu trữ sử dụng lâu dài, chúng lưu vào cấu trúc tập tin (file), thư mục Với lượng lưu trữ lớn, nhiều ngữ cảnh, có nhu cầu nén liệu: tiết kiệm không gian lưu trữ, truyền tải qua mạng nhanh hơn, gọn nhẹ dễ dàng chép,… từ đó, nhiều chương trình nén liệu đời: WinZip, WinRar, 7-Zip, tar, … Trong tập lớn này, sinh viên thực phương pháp nén liệu đơn giản dựa “Huffman coding”, chi tiết phương pháp sinh viên tham khảo đây: http://en.wikipedia.org/wiki/Huffman_coding Như biết, để biểu diễn ký tự thông thường (a, b,…,A,…Z,0 9, ~!@#$% ) sử dụng bảng mã ASCII, byte (8 bits) sử dụng để biểu diễn cho ký tự, ví dụ: ‘A’ biểu diễn tương ứng với 65, ‘0’ tương ứng với giá trị 48 Tuy nhiên, việc biểu diễn đôi lúc gây lãng phí, thực tế ký tự khác có tần số sử dụng không giống nhau, ví dụ ký tự ‘a’, ‘e’ thường sử dụng nhiều ký tự khác văn Vì vậy, ý tưởng “Huffman coding” sử dụng chuỗi bit có độ dài khác để biểu diễn cho ký tự dựa vào tần số xuất ký tự đó, ký tự có tần số xuất cao sử dụng bit để biểu diễn cho ký tự Chi tiết phương pháp sinh viên tham khảo theo đường link Để đơn giản, sinh viên yêu cầu thực chương trình nén, giải nén cho file dạng text Giải thuật a) Để thực chương trình nén, giải nén theo phương pháp “Huffman coding” bước sau thực hiện: 503001 – Cấu trúc liệu giải thuật – Assignment Khoa Khoa học Kỹ thuật máy tính Bộ môn Khoa học máy tính Giải thuật nén: Đọc file text, đếm số lượng xuất ký tự Xây dựng Huffman tree ( theo giải thuật xây dựng Huffman) Dựa vào vừa xây dựng, đọc lại file text, ứng với ký tự ghi chuỗi bit tương ứng Giải thuật xây dựng Huffman (tham khảo chi tiết link): Create a leaf node for each symbol and add it to the priority queue While there is more than one node in the queue: Remove the two nodes of highest priority (lowest probability) from the queue Create a new internal node with these two nodes as children and with probability equal to the sum of the two nodes' probabilities Add the new node to the queue The remaining node is the root node and the tree is complete b) Để thực việc giải nén giải thuật sau thực hiện: Đọc header file, kiểm tra định dạng Từ header đọc từ điển nén (mỗi ký tự nén bit, chuỗi bit nào) Xây dựng lại Huffman tree dựa vào từ điển nén Đọc phần body file bit dựa vào Huffman tree vừa xây dựng để giải nén lấy ký tự ban đầu 503001 – Cấu trúc liệu giải thuật – Assignment 2 Khoa Khoa học Kỹ thuật máy tính Bộ môn Khoa học máy tính Hiện thực tập lớn Sinh viên đọc kỹ đặc tả nội dung tập lớn, tham khảo đường link Wikipedia đính kèm theo Trong tập lớn này, sinh viên cung cấp sẵn số files mã nguồn bao gồm: - HCZHeader.h, HCZHeader.cpp: định nghĩa class dùng để đọc, ghi, xử lý header cho file nén Reader.h, Reader.cpp: định nghĩa class dùng để đọc thông tin từ file theo bit, byte, word, dword Writer.h, Writer.cpp: định nghĩa class dùng để ghi thông tin file theo bit, byte, word, dword Main.cpp: chứa hàm main gọi lúc chương trình thực thi HuffmanCode.h , HuffmanCode.cpp: file định nghĩa thực giải thuật nén, giải nén dựa theo phương pháp HuffmanCode Input.txt: chứa ví dụ mẫu sử dụng để nén Makefile: sử dụng để dịch chương trình, tạo file thực thi (sử dụng cygwin hay Linux) File nén mà chương trình sinh hay sử dụng có cấu trúc gồm header liền sau phần body theo mô tả dưới: Header: Code (3 bytes): ‘HCZ’ bodySize (4 bytes) (number of bits in body) Number of character (2 byte) value x Character list (x bytes) List of bits used for each character (x bytes) (total -> y) List of bit code for all character by order (([(y + 7) / 8] bytes) Body: Text code HCZHeader thực với đầy đủ phương thức cần thiết để làm việc với Header này, sinh viên cần tìm hiểu sử dụng hợp lý trình nén, giải nén Trong đó: bodySize: tổng kích thước (tính bit) phần text sau nén Number of character: số lượng ký tự sử dụng, giả sử giá trị x Character list: danh sách ký tự sử dụng text ban đầu (x ký tự) 503001 – Cấu trúc liệu giải thuật – Assignment Khoa Khoa học Kỹ thuật máy tính Bộ môn Khoa học máy tính List of bits used for each character: danh sách số lượng bit biểu diễn cho ký tự (danh sách có x phần tử) Giả sử tổng tất giá trị danh sách y List of bit code for all character by order: chuỗi bit biểu diễn tương ứng theo thứ tự dùng mã hóa cho ký tự tương ứng với danh sách Character list Ví dụ với đoạn text sau: abcdabcaba Sau phân tích giả sử ta mã hóa ký tự tương ứng với chuỗi bit sau: a-0, b-10, c-111, d-110, độ dài tương ứng chuỗi bit 1, 2, Từ theo chuỗi text chuỗi bit biểu diễn ta có thông tin sau: bodySize = 19, Number of character x = 4, Character list = {a, b, c, d}, List of bits used for each character = {1, 2, 3, 3}, List of bit code = “010111110” (biểu diễn máy tính dạng nhị phân) Tương ứng với ví dụ ta có chuỗi bit cho đoạn text nén sau: 0101111100101110100 Chú ý: trường hợp bodySize không chia hết cho (không lấp hết byte cuối cùng) sinh viên sử dụng đến số bit bodySize, không sử dụng bit lại Đây trường hợp xảy giải nén file nén Ở ví dụ trên, chuỗi bit nén bổ sung bit (0 vào cuối) cho tròn byte (3 bytes = 24 bit) trước ghi file, đơn vị nhỏ mà file quản lý byte Trong trường hợp này, bit cuối ý nghĩa Sinh viên yêu cầu chỉnh sửa hai file HuffmanCode.h HuffmanCode.cpp để định nghĩa thực nội dung tập lớn Sinh viên thêm, bớt hàm, thủ tục hay biến, … nhiên sinh viên không phép sử dụng thêm thư viên nào, sử dụng thư viện include sẵn Hai phương thức gọi từ chương trình là: zip (char* inputFile, char* outputFile) thực việc nén file input tạo file nén upzip (char* inputFile, char* outputFile) thực việc giải nén file nén theo phương pháp Vì sinh viên không phép chỉnh sửa tên tham số, không thực hàm giữ nguyên trạng Chấm tập lớn Bài tập lớn chấm dựa theo testcase, làm sinh viên biên dịch thực thi số lượng lớn testcase khác Một số lưu ý chấm tập lớn sau: 503001 – Cấu trúc liệu giải thuật – Assignment Khoa Khoa học Kỹ thuật máy tính Bộ môn Khoa học máy tính - - Với giải thuật trên, có kết nén khác nhau, nhiên thực tỉ lệ nén nhiều thay đổi Đối với testcase yêu cầu unzip, so khớp kết sinh sinh viên với file trước bị nén, điểm tương ứng 0/1 Đối với testcase yêu cầu zip o File nén sinh viên sinh chương trình mẫu giải nén ngược lại để so sánh với file trước nén, phục hồi file gốc bị điểm cho testcase o Sẽ chấm dựa vào mức độ tốt (tỉ lệ nén) so sánh với tỉ lệ nén solution, điểm testcase đến 1.1 (1.1 mà tỉ lệ nén cao solution) Với phương pháp trên, ta unzip file nén zip với phương pháp Điểm tổng hợp tập lớn = tổng điểm * 10 / tổng số testcase III- Nộp Khi nộp bài, sinh viên sử dụng account cấp phát để nộp qua hệ thống Sakai Sinh viên nộp hai file HuffmanCode.h HuffmanCode.cpp (tên file phải viết dạng chữ hoa, chữ thường) File nộp phải file chương trình gốc, SINH VIÊN KHÔNG ĐƯỢC NÉN FILE KHI NỘP BÀI Sinh viên phải kiểm tra chương trình Cygwin trước nộp Thời hạn chót để nộp 14:00 ngày thứ sáu 1/11/2013 KHÔNG nhận gửi qua mail hình thức khác Bài nộp trễ KHÔNG nhận IV- Xử lý gian lận Bài tập lớn phải sinh viên TỰ LÀM Sinh viên bị coi gian lận nếu: - Có giống bất thường mã nguồn nộp Trong trường hợp này, TẤT CẢ nộp bị coi gian lận Do sinh viên phải bảo vệ mã nguồn tập lớn - Sinh viên không hiểu mã nguồn viết, trừ phần mã cung cấp sẵn chương trình khởi tạo Sinh viên tham khảo từ nguồn tài liệu nào, nhiên phải đảm bảo hiểu rõ ý nghĩa tất dòng lệnh mà viết Trong trường hợp không hiểu rõ mã nguồn nơi tham khảo, sinh viên đặc biệt cảnh báo KHÔNG ĐƯỢC sử dụng mã nguồn này; thay vào nên sử dụng học để viết chương trình Trong trường hợp bị kết luận gian lận, sinh viên bị điểm cho toàn môn học (không tập lớn) KHÔNG CHẤP NHẬN BẤT KỲ GIẢI THÍCH NÀO VÀ KHÔNG CÓ BẤT KỲ NGOẠI LỆ NÀO! 503001 – Cấu trúc liệu giải thuật – Assignment

Ngày đăng: 26/11/2015, 21:32