Cấu trúc dữ liệu & Giải thuật (Data Structures and Algorithms) Các thuật toán nén dữ liệu (Data Compression Algorithms) Data Compression Giới thiệu Giải thuật nén RLE Giải thuật nén Huffman 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 2 Giới thiệu Các thuật ngữ thường dùng: Data Compression Lossless Compression Lossy Compression Encoding Decoding Run / Run Length RLE, Huffman, LZW 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 3 Giới thiệu (tt) Mục đích của nén dữ liệu: Giảm kích thước dữ liệu: Khi lưu trữ Khi truyền dữ liệu Tăng tính bảo mật 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 4 Giới thiệu (tt) Có 2 hình thức nén: Nén bảo toàn thông tin (Lossless Compression): Không mất mát thông tin nguyên thuỷ Hiệu suất nén không cao: 10% - 60% Các giải thuật tiêu biểu: RLE, Arithmetic, Huffman, LZ77, LZ78,… Nén không bảo toàn thông tin (Lossy Compression): Thông tin nguyên thủy bị mất mát Hiệu suất nén cao 40% - 90% Các giải thuật tiêu biểu: JPEG, MP3, MP4,… 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 5 Giới thiệu (tt) Hiệu suất nén (%): Tỉ lệ % kích thước dữ liệu giảm được sau khi áp dụng thuật toán nén D (%) = (N – M)/N*100 D: Hiệu suất nén N: kích thước data trước khi nén M: kích thước data sau khi nén Hiệu suất nén tùy thuộc Phương pháp nén Đặc trưng của dữ liệu 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 6 Giới thiệu (tt) Nén tập tin: Dùng khi cần Backup, Restore,… dữ liệu Dùng các thuật toán nén bảo toàn thông tin Không quan tâm đến định dạng (format) của tập tin Các phần mềm: PKzip, WinZip, WinRar,… 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 7 Data Compression Giới thiệu Giải thuật nén RLE Giải thuật nén Huffman 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 8 Giải thuật nén RLE RLE = Run Length Encoding: mã hoá theo độ dài lặp lại của dữ liệu Ý tưởng Dạng 1: RLE với file *.PCX Dạng 2: RLE với file *.BMP Nhận xét 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 9 Giải thuật nén RLE (tt) Tư tưởng: Hình thức biểu diễn thông tin dư thừa đơn giản: “đường chạy” (run) – là dãy các ký tự lặp lại liên tiếp “đường chạy” được biểu diễn ngắn gọn: <Số lần lặp> <Ký tự> Khi độ dài đường chạy lớn Tiết kiệm đáng kể Ví dụ: Data = AAAABBBBBBBBCCCCCCCCCCDEE (# 25 bytes) Datanén = 4A8B10C1D2E (# 10 bytes) 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 10 Giải thuật nén RLE (tt) Tư tưởng: (tt) Khi vận dụng thực tế, cần có biện pháp xử lý để tránh trường hợp “phản tác dụng” đối với các “run đặc biệt – 1 ký tự” X (# 1 bytes) 1X (# 2 bytes) 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 11 Giải thuật nén RLE (tt) Dạng 1: RLE với file *.PCX 1 1 0 0 1 1 0 1 0 1 0 0 0 0 0 1 Hai bit n = 6 bit thaáp d = byte döõ cao baät cho bieát soá lieäu keá tieáp “11” laàn laëp… ñöôïc laëp Trường hợp “run bình thường”: AAAAAAAAAAAAA 13 A (biểu diễn 2 bytes) 0xCD 0x41 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 12 Giải thuật nén RLE (tt) RLE trong cấu trúc file *.PCX (tt) 0 1 0 0 0 0 0 1 Hai bit cao Ñaây laø byte khoâng baät döõ lieäu (soá laàn laëp = 1) Trường hợp “run đặc biệt”: A A (biểu diễn 1 byte) 0x41 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 13 Giải thuật nén RLE (tt) RLE trong cấu trúc file *.PCX (tt) 1 1 0 0 0 0 0 1 1 1 0 1 1 0 0 1 Hai bit n = 6 bit thaáp d = byte döõ cao baät cho bieát soá lieäu keá tieáp “11” laàn laëp (= 1) ñöôïc laëp Trường hợp “run đặc biệt”: 0xD9(217 d) 1 0xD9 (biểu diễn 2 bytes) 0xC1 0xD9 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 14 Giải thuật nén RLE (tt) RLE trong cấu trúc file *.PCX (tt) Ưu điểm: Cài đặt đơn giản Giảm các trường hợp “phản tác dụng” của những run đặc biệt Khuyết điểm: Dùng 6 bit biểu diễn số lần lặp chỉ thể hiện được chiều dài max = 63 Các đoạn lặp dài sẽ phải lưu trữ lặp lại Không giải quyết được trường hợp “phản tác dụng” với run đặc biệt có mã ASCII >= 192d 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 15 Giải thuật nén RLE (tt) RLE trong cấu trúc file *.PCX (tt) Vì sao dùng 2 bits làm cờ hiệu, mà không dùng 1 bit ? 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 16 Giải thuật nén RLE (tt) #define MAX_RUNLENGTH 63 int PCXEncode_a_String(char *aString, int nLen, FILE *fEncode) { unsigned char cThis, cLast; int i; int nTotal = 0; // Tổng số byte sau khi mã hoá int nRunCount = 1; // Chiều dài của 1 run cLast = *(aString); for (i=0; i<nLen; i++) { cThis = *(++aString); if (cThis == cLast) { // Tồn tại 1 run nRunCount++; if (nRunCount == MAX_RUNLENGTH) { nTotal += PCXEncode_a_Run(cLast,nRunCount,fEncode); nRunCount = 0; } } Continued… 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 17 Giải thuật nén RLE (tt) else // Hết 1 run, chuyển sang run kế tiếp { if (nRunCount) nTotal += PCXEncode_a_Run(cLast,nRunCount,fEncode); cLast = cThis; nRunCount = 1; } } // end for if (nRunCount) // Ghi run cuối cùng lên file nTotal += PCXEncode_a_Run(cLast, nRunCount, fEncode); return (nTotal); } // end function 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 18 Giải thuật nén RLE (tt) int PCXEncode_a_Run(unsigned char c, int nRunCount, FILE *fEncode) { if (nRunCount) { if ((nRunCount == 1) && (c < 192)) { putc(c, fEncode); return 1; } else { putc(0xC0 | nRunCount, fEncode); putc(c, fEncode); return 2; } } 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 19 Giải thuật nén RLE (tt) int PCXDecode_a_File(FILE *fEncode, FILE *fDecode) { unsigned char c, n; while (!feof(fEncode)) { c = (unsigned char) getc(fEncode); if (c == EOF) break; if ((c & 0xC0) == 0xC0) // 2 bit cao bật { n = c & 0x3f; // Lấy 6 bit thấp số lần lặp… c = (unsigned char) getc(fEncode); } else n = 1; // Ghi dữ liệu đã giải mã lên file fDecode for (int i=0; i<n; i++) putc(c, fDecode); } fclose(fDecode); } 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 20 Giải thuật nén RLE (tt) Dạng 2: RLE với file *.BMP Định dạng file chuẩn của Windows dùng để lưu ảnh bitmap Có khả năng lưu trữ ảnh B&W, 16 màu, 256 màu, 24bits màu Có sử dụng thuật toán nén RLE khi lưu trữ dữ liệu điểm ảnh 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 21 Giải thuật nén RLE (tt) RLE trong cấu trúc file *.BMP (tt) AAA………………………………………A lặp 255 lần Neùn PCX Dữ liệu lưu lặp lại vì số lần lặp chỉ sử dụng có 6 bits 0xFF’A’0xFF’A’ 0xFF’A’0xFF’A’ 0xC3’A’ 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 22 Giải thuật nén RLE (tt) RLE trong cấu trúc file *.BMP (tt) Ý tưởng: Dữ liệu có 2 dạng Dạng 1: Run với độ dài > 1. AAAAAAAAAAAA Dạng 2: Dãy các ký tự đơn lẻ. BCDEFG Biểu diễn: phân biệt 2 dạng bằng cách dùng “mã nhận dạng” (ESCAPE 0x00) Dạng 1: <Số lần lặp> <Ký tự lặp> VD. 0x0C ‘A’ Dạng 2: <ESCAPE> <n> <Dãy ký tự> VD.
0x00 0x06 ‘B’’C’’D’’E’’F’’G’ 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 23 Giải thuật nén RLE (tt) RLE trong cấu trúc file *.BMP (tt) AAA………………………………………ABCDEFG lặp 255 lần Neùn BMP 0xFF ‘A’ 0x00 0x06 “BCDEFG” 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 24 Giải thuật nén RLE (tt) So sánh giữa PCX RLE và BMP RLE ? 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 25 Giải thuật nén RLE (tt) int BMPDecode_a_File(FILE *fEncode, FILE *fDecode) { unsigned char cMode, cData; int i, n; while (!feof(fEncode)) { cMode = (unsigned char) getc(fEncode); if (cMode==EOF) break; if (cMode==0) { // Dạng 2 n = (unsigned char) getc(fEncode); for (i=0; i<n; i++) { cData = (unsigned char) getc(fEncode); putc(cData, fDecode); } } Continued… 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 26 Giải thuật nén RLE (tt) else // Dạng 1 { n = cMode; // Số lần lặp cData = (unsigned char) getc(fEncode); for (i=0; i<n; i++) putc(cData, fDecode); } } // end while } // end 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 27 Giải thuật nén RLE (tt) Nhận xét / Ứng dụng: Dùng để nén các dữ liệu có nhiều đoạn lặp lại (run) Thích hợp cho dữ liệu ảnh ứng dụng hẹp Chưa phải là một thuật toán nén có hiệu suất cao Đơn giản, dễ cài đặt 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 28 Data Compression Giới thiệu Giải thuật nén RLE Giải thuật nén Huffman 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 29 Giải thuật nén Huffman Giới thiệu Huffman tĩnh (Static Huffman) Huffman động (Adaptive Huffman) 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.HCM 30 Giải thuật nén Huffman – Giới thiệu Hình thành Vấn đề: Một giải thuật nén bảo toàn thông tin; Không phụ thuộc vào tính chất của dữ liệu; Ứng dụng rộng rãi trên bất kỳ dữ liệu nào, với hiệu suất tốt Tư tưởng chính: Phương pháp cũ: dùng 1 dãy cố định (8 bits) để biểu diễn 1 ký tự Huffman: Sử dụng vài bits để biểu diễn 1 ký tự (gọi là “mã bit” – bits code) Độ dài “mã bit” cho các ký tự không giống nhau: Ký tự xuất hiện nhiều lần biểu diễn bằng mã ngắn; Ký tự xuất hiện ít biểu diễn bằng mã dài Mã hóa bằng mã có độ dài thay đổi (Variable Length Encoding) David Huffman – 1952: tìm ra phương pháp xác định mã tối ưu trên dữ liệu tĩnh 09/2013 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH KHTN Tp.