Data Structures & Algorithms Các thuật toán nén dữ liệu (Data Compression Algorithms) Nguyễn Tri Tuấn Khoa CNTT – ĐH.HCM Email: nttuan@fit.vn Data Compression Giới thiệu Giải thuật nén RLE Giải thuật nén Huffman Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.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 Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.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 Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.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,… Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.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 Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.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,… Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.HCM 7 Data Compression Giới thiệu Giải thuật nén RLE Giải thuật nén Huffman Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.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 Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.HCM 9 Giải thuật nén RLE (tt) Ý 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) Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.HCM 10 Giải thuật nén RLE (tt) Ý 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 chỉ có 1 ký tự” X (# 1 bytes) 1X (# 2 bytes) Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.HCM 11 Giải thuật nén RLE (tt) Dạng 1: RLE trong định dạng file *.PCX 1 1 0 0 1 1 0 1 0 1 0 0 0 0 0 1 Hai bit n = 6 bit thấp d = byte dữ liệu cao bật cho biết số lần kế tiếp được “11” lặp… lặp Trường hợp “run bình thường”: AAAAAAAAAAAAA 13 A (biểu diễn 2 bytes) 0xCD 0x41 Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.HCM 12 Giải thuật nén RLE (tt) RLE trong định dạng file *.PCX (tt) 0 1 0 0 0 0 0 1 Hai bit cao Đây là byte dữ không bật liệu (số lần lặp=1) Trường hợp “run đặc biệt”: A A (biểu diễn 1 byte) 0x41 Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.HCM 13 Giải thuật nén RLE (tt) RLE trong định dạng file *.PCX (tt) 1 1 0 0 0 0 0 1 1 1 0 1 1 0 0 1 Hai bit n = 6 bit thấp d = byte dữ liệu cao bật cho biết số lần kế tiếp được “11” lặp (= 1) lặp Trường hợp “run đặc biệt”: 0xD9(217 d) 1 0xD9 (biểu diễn 2 bytes) 0xC1 0xD9 Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.HCM 14 Giải thuật nén RLE (tt) RLE trong định dạng file *.PCX (tt) Ưu điểm: Cài đặt đơn giản Giảm 75% 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 run max = 63 Các đoạn lặp dài hơn sẽ phải chia nhỏ để mã hóa 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 Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.HCM 15 Giải thuật nén RLE (tt) RLE trong định dạng file *.PCX (tt) Vì sao dùng 2 bits làm cờ hiệu, mà không dùng 1 bit ? Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.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… Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.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 Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.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; } } Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.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); } Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.HCM 20 Giải thuật nén RLE (tt) Dạng 2: RLE trong định dạng 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 Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.HCM 21 Giải thuật nén RLE (tt) RLE trong trong định dạng 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’ Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.HCM 22 Giải thuật nén RLE (tt) RLE trong trong định dạng 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’ Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.HCM 23 Giải thuật nén RLE (tt) RLE trong trong định dạng file *.BMP (tt) AAA………………………………………ABCDEFG lặp 255 lần Neùn BMP 0xFF ‘A’ 0x00 0x06 “BCDEFG” Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.HCM 24 Giải thuật nén RLE (tt) So sánh giữa PCX RLE và BMP RLE ? Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.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… Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.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 Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.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 Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.HCM 28 Data Compression Giới thiệu Giải thuật nén RLE Giải thuật nén Huffman Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.HCM 29 Giải thuật nén Huffman Giới thiệu Huffman tĩnh (Static Huffman) Huffman động (Adaptive Huffman) Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.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 Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.HCM 31 Giải thuật nén Huffman – Giới thiệu (tt) Giả sử có dữ liệu như sau: f = “ADDAABBCCBAAABBCCCBBBCDAADDEEAA” Biểu diễn bình thường (8 bits/ký tự): Sizeof(f) = 10*8 + 8*8 + 6*8 + 5*8 + 2*8 = 248 bits Ký tự Số lần xuất hiện trong file f A 10 B 8 C 6 D 5 E 2 Winter 2015 Data Structures & Algorithms - Data Compression - Nguyen Tri Tuan, DH.