Slide 1 NÉN DỮ LiỆU Giảng viên Văn Chí Nam – Nguyễn Thị Hồng Nhung – Đặng Nguyễn Đức Tiến Cấu trúc dữ liệu và giải thuật 1 Nội dung trình bày 2 Cấu trúc dữ liệu và giải thuật HCMUS 2011 2 Giới thiệu M[.]
Trang 1Cấu trúc dữ liệu và giải thuật
NÉN DỮ LIỆU
Giảng viên:
Văn Chí Nam – Nguyễn Thị Hồng Nhung – Đặng Nguyễn Đức Tiến
Trang 2Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 3Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Lossless data compression
Lossy data compression
Trang 4Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 5Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 6Cấu trúc dữ liệu và giải thuật - HCMUS 2011
6
Khái niệm
Tỷ lệ nén (Data compression ratio)
Tỷ lệ giữa kích thước của dữ liệu nguyên thủy và của dữ liệu sau khi áp dụng thuật toán nén.
Gọi:
N là kích thước của dữ liệu nguyên thủy,
N1 là kích thước của dữ liệu sau khi nén.
R
Trang 7Cấu trúc dữ liệu và giải thuật - HCMUS 2011
7
Khái niệm
Tỷ lệ nén (Data compression ratio)
Về khả năng tiết kiệm không gian: Tỷ lệ của việc giảm kích thước dữ liệu sau khi áp dụng thuật toán nén.
Gọi:
N là kích thước của dữ liệu nguyên thủy,
N1 là kích thước của dữ liệu sau khi nén.
Tỷ lệ nén R:
Ví dụ:
Dữ liệu ban đầu 8KB, nén còn 2 KB Tỷ lệ nén: 75%
N N
R 1 1
Trang 8Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 9Cấu trúc dữ liệu và giải thuật - HCMUS 2011
9
Khái niệm
Nén dữ liệu mất mát thông tin (Lossy data
compression)
Dữ liệu nén được phục hồi
không giống hoàn toàn với dữ liệu nguyên thủy;
Âm thanh: AAC, MP2, MP3;
Video: MPEG-2, MPEG-4
Trang 10Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Nén Huffman tĩnh
10
Trang 11Cấu trúc dữ liệu và giải thuật - HCMUS 2011
11
Giới thiệu
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.
Trang 12Cấu trúc dữ liệu và giải thuật - HCMUS 2011
12
Giới thiệu
Tư tưởng chính:
Phương pháp cũ: dùng 1 dãy bit cố định để biểu diễn 1 ký tự
David Huffman (1952): tìm ra phương pháp xác định mã tối ưu trên dữ liệu tĩnh :
Sử dụng vài bit để biểu diễn 1 ký tự (gọi là “mã bit” – bit 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)
Trang 13Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 14Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 15Cấu trúc dữ liệu và giải thuật - HCMUS 2011
[B3]: Phát sinh bảng mã bit cho từng ký tự tương ứng
[B4]: Duyệt tập tin -> Thay thế các ký tự trong tập tin bằng mã bit tương ứng.
[B5]: Lưu lại thông tin của cây Huffman cho giải nén
Trang 16Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 17Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 18Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Thuật toán nén – Tạo cây Huffman
Cây Huffman: cây nhị
phân
Mỗi node lá chứa 1 ký tự
Mỗi node cha chứa các ký
tự của những node con.
Trọng số của node:
Node con: tần số xuất hiện của ký tự tương ứng
Node cha: Tổng trọng số của các node con.
Trang 19Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 20Cấu trúc dữ liệu và giải thuật - HCMUS 2011
20
Thuật toán nén – Tạo cây Huffman
Phát sinh cây:
Bước 1: Chọn trong bảng thống kê hai phần tử x,y có trọng số thấp nhất.
Bước 2: Tạo 2 node của cây cùng với node cha z có trọng số bằng tổng
trọng số của hai node con.
Bước 3: Loại 2 phần tử x,y ra khỏi bảng thống kê.
Bước 4: Thêm phần tử z vào trong bảng thống kê.
Bước 5: Lặp lại Bước 1-4 cho đến khi còn 1 phần tử trong bảng thống kê.
Trang 21Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Nếu 2 node có trọng số bằng nhau
Node nào có ký tự nhỏ hơn thì nằm bên trái
Node có ký tự lớn hơn nằm bên phải.
Trang 22Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 23Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 24Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 25Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 26Cấu trúc dữ liệu và giải thuật - HCMUS 2011
26
Thuật toán nén – Tạo cây Huffman
Ký tự Tần số
Trang 27Cấu trúc dữ liệu và giải thuật - HCMUS 2011
27
Thuật toán nén – Phát sinh mã bit
Mã bit của từng ký tự: đường đi từ node gốc của cây Huffman đến node lá của ký tự đó.
Bit 0 được tạo ra khi đi qua nhánh trái
Bit 1 được tạo ra khi đi qua nhánh phải
Trang 28Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 29Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 30Cấu trúc dữ liệu và giải thuật - HCMUS 2011
30
Thuật toán nén – Lưu lại thông tin
Phục vụ cho việc giải nén.
Cây Huffman
Bảng tần số
Trang 31Cấu trúc dữ liệu và giải thuật - HCMUS 2011
31
Thuật toán giải nén
Phục hồi cây Huffman dựa trên thông tin đã lưu trữ.
Lặp
Đi từ gốc cây Huffman
Đọc từng bit từ tập tin đã được nén
Nếu bit 0: đi qua nhánh trái
Nếu bit 1: đi qua nhánh phải
Nếu đến node lá: xuất ra ký tự tại node lá này.
Cho đến khi nào hết dữ liệu
Trang 32Cấu trúc dữ liệu và giải thuật - HCMUS 2011
32
Vấn đề khác
thống kê tần số vào trong tập tin nén hay không?
Trang 33Cấu trúc dữ liệu và giải thuật - HCMUS 2011
33
Vấn đề khác
Thống kê sẵn trên dữ liệu lớn và tính toán sẵn cây
Huffman cho bộ mã hóa và bộ giải mã.
Ưu điểm:
Giảm thiểu kích thước của tập tin cần nén.
Giảm thiểu chi phí của việc duyệt tập tin để lập bảng thống kê
Khuyết điểm:
Hiệu quả không cao trong trường hợp khác dạng dữ liệu đã thống kê
Trang 34Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Hỏi và Đáp
34
Trang 35Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Nén Run-Length Encoding
Nén Huffman động
Đọc thêm
Trang 36Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Nén Run-Length Encoding
36
Trang 37Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 38Cấu trúc dữ liệu và giải thuật - HCMUS 2011
38
Khái niệm
Đường chạy (run)
Dãy các ký tự giống nhau liên tiếp
Trang 39Cấu trúc dữ liệu và giải thuật - HCMUS 2011
39
Ý tưởng
chiều dài của đường chạy.
Đường chạy được biểu diễn lại:
<Số lượng ký tự> <Ký tự>
Ví dụ:
Chuỗi đầu vào: AAA bbbbbC ddd E bbbb (#17 bytes)
Kết quả nén: 3A 5b1C 3d 1E 4b (#12 bytes)
Trang 40Cấu trúc dữ liệu và giải thuật - HCMUS 2011
40
Ý tưởng
Trong thực tế, có khả năng gây ‘hiệu ứng
ngược’:
Dữ liệu nén: ABCDEFGH (8 bytes)
Kết quả nén: 1A1B1C1D1E1F1G1H (16 bytes)
Trang 41Cấu trúc dữ liệu và giải thuật - HCMUS 2011
41
Nén RLE trên PCX
Byte xác định số lượng (nhiều hơn 1): 2 bit 6,7 được bật.
Trang 42Cấu trúc dữ liệu và giải thuật - HCMUS 2011
42
Nén RLE trên PCX
Byte xác định số lượng : 2 bit 6,7 được bật.
Số lần lặp (số lượng) tối đa: 63
Giá trị dữ liệu tối đa: 191 (0-191)
Số lần lặp là 1?
Dữ liệu có giá trị dưới 192?
Dữ liệu có giá trị từ 192?
Trang 43Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Ảnh hưởng (nhầm lẫn với thông tin số lượng).
Sử dụng 2 byte: <Số lượng = 1> <Dữ liệu>
Ví dụ: nén ký tự 0xDB (21910)
Trang 44Cấu trúc dữ liệu và giải thuật - HCMUS 2011
44
Nén RLE trên PCX - Nhận xét
Ưu điểm:
Cài đặt đơn giản
Giảm các trường hợp “hiệu ứng ngược” của những đường chạy đặ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 tối
đa 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 “hiệu ứng ngược” với đường chạy đặc biệt có mã ASCII >= 192
Trang 45Cấu trúc dữ liệu và giải thuật - HCMUS 2011
unsigned char cThis, cLast;
int nTotal = 0; // Tổng số byte sau khi mã hoáint nRunCount = 1; // Chiều dài của 1 run
}}
Trang 46Cấu trúc dữ liệu và giải thuật - HCMUS 2011
46
Nén RLE trên PCX - Cài đặt
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);
}
Trang 47Cấu trúc dữ liệu và giải thuật - HCMUS 2011
47
Nén RLE trên PCX - Cài đặt
int PCXEncode_a_Run(unsigned char c, int nRunCount, FILE
Trang 48Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 49Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 50Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 51Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 52Cấu trúc dữ liệu và giải thuật - HCMUS 2011
0x00 0x02 <DeltaX> <DeltaY>: đoạn nhảy (DeltaX,
DeltaY) tính từ vị trí hiện tại Dữ liệu kế tiếp được áp dụng tại vị trí mới.
Trang 53Cấu trúc dữ liệu và giải thuật - HCMUS 2011
53
Nén RLE trên BMP – Tóm tắt
Trang 54Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 55Cấu trúc dữ liệu và giải thuật - HCMUS 2011
55
Nén RLE trên BMP – Ví dụ
Trang 56Cấu trúc dữ liệu và giải thuật - HCMUS 2011
56
So sánh
So sánh giữa RLE trên PCX và trên BMP?
Trang 57Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 58Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Nén Huffman động
58
Trang 59Cấu trúc dữ liệu và giải thuật - HCMUS 2011
59
Điểm hạn chế của nén Huffman tĩnh
Duyệt tập tin hai lần (thống kê và mã hóa) -> tốn chi phí.
Phải lưu trữ cây Huffman/bảng tần số trong dữ liệu nén -> tăng kích thước dữ liệu nén.
nén đã có sẵn đầy đủ.
Trang 60Cấu trúc dữ liệu và giải thuật - HCMUS 2011
60
Ý tưởng cải tiến
cây Huffman và nén dữ liệu
=> nén dữ liệu ĐỘNG.
Trang 61Cấu trúc dữ liệu và giải thuật - HCMUS 2011
61
Phân tích
Có thể tiến hành nén dữ liệu theo thời gian thực.
Không cần lưu trữ thông tin cây Huffman.
Chỉ cần việc đọc dữ liệu một lần.
Trang 62Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Node trong: tổng trọng số của các node con.
Ký tự chưa từng xuất hiện nằm chung một node có trọng số 0.
Node gốc (root):
Node có trọng số lớn nhất cây Huffman.
Trang 63Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Khởi tạo cây:
Cây gồm duy nhất một node gán giá trị NYA và có trọng số là 0.
Trang 64Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 65Cấu trúc dữ liệu và giải thuật - HCMUS 2011
65
Tính chất cây Huffman động
Cây Huffman n node lá có tổng cộng (2*n – 1)
node
Mỗi node trên cây có trọng số thỏa mãn tính chất quy ước.
Trang 66Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 67Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 68Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Phát sinh mã bit cho c:
Mã bit c = mã bit của node NYA và mã ASCII (8 bit) của c
Trang 69Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 70Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 71Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 72Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 73Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 74Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 75Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 76Cấu trúc dữ liệu và giải thuật - HCMUS 2011
76
Thuật toán nén
Gọi x là node hiện hành.
Duyệt từ trái sang phải, từ dưới lên trên:
Nếu tồn tại node y sao cho trọng số của y nhỏ hơn trọng số của x
Thì x là node vi phạm tính chất Anh/em.
Trang 77Cấu trúc dữ liệu và giải thuật - HCMUS 2011
77
Thuật toán nén
Hiệu chỉnh cây khi node vi phạm tính chất
Anh/em:
Gọi x là node vi phạm tính chất Anh/em.
Duyệt từ trái sang phải, từ dưới lên trên:
Tìm node y ở xa x nhất có trọng số nhỏ hơn trọng số của x.
Đổi chỗ x và y.
Cập nhật giá trị các node cha tương ứng.
Lặp lại cho đến khi không còn node nào vi phạm.
Trang 78Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 79Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 80Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 81Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 82Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 83Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 84Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 85Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Trang 86Cấu trúc dữ liệu và giải thuật - HCMUS 2011
86
Thuật toán giải nén
B1: Khởi tạo cây Huffman ban đầu (gồm 1 node NYA).
B2: Giải nén dữ liệu dựa trên cây Huffman và dữ liệu nhận được (bit 0: nhánh trái, bit 1: nhánh phải).
Nếu nhận được dữ liệu NYA.
Nếu không:
B3: Thêm ký tự c vào cây Huffman Cập nhật cây.
B4: Quay lại từ bước 2.
Trang 87Cấu trúc dữ liệu và giải thuật - HCMUS 2011
87
Tóm tắt
Giải thuật nén Huffman là giải thuận nén dạng không mất mát thông tin.
Các ký tự được nén và giải nén dựa trên mã bit.
Chiều dài các mã bit là không giống nhau.
Có thể áp dụng thuật toán này cho các loại dữ liệu khác nhau: tập tin văn bản, nhị phân,
Trang 88Cấu trúc dữ liệu và giải thuật - HCMUS 2011
Xây dựng cây Huffman theo thời gian thực.
Không cần biết trước toàn bộ nội dung dữ liệu cần nén.