Huffman đã đưa ra một thuật toán đơn giản để tối ưu tương đối mã Entropy, mã này được gọi là mã Huffman. Mã Huffman là một hình thức của mã
tiền tố, có nghĩalà mã Huffman không thể là tiền tố của các mã khác. Mã Huffman
là một mã tối ưu bởi vì mã Huffman có thể giảm thiểu độ dài trung bình từ mã.Thuật toán Huffman gồm các bước sau:
1. Sắp xếp các ký tự theo thứ tự xác suất giảm dần.
2. Gán cho hai ký tự với xác suất xuất hiện thấp nhất với hai nhánh (0) và (1) của cây mã. Hai ký tự có xác suất thấp nhất giảm còn một ký tự với xác suất bằng tổng hai xác suất.
3. Lặp lại các bước từ bước 1 cho đến khi còn lại hai ký tự với hai nhánh (0) và (1). Bít (0) tương ứng với ký tự có xác suất lớn hơn ký tự ở nhánh của (1).
4. Duyệt cây mã để tìm ra từ mã tương ứng với mỗi ký tự của nguồn. Ví dụ: cho nguồn tin có xác suất các ký tự tương ứng như bảng sau:
S0 S1 S2 S3 S4 S5 S6 S7
0.36 0.14 0.13 0.12 0.10 0.09 0.04 0.02
Entropy của nguồn là:
H = (bit/ký tự)
Entropy cực đại của nguồn là: H = log28=3 (bit/ký tự).
Như vậy hiệu suất của nguồn là: ᶯ =
Mỗi kí tự trên được mã hóa thành 3 bit thì hiệu suất mã hóa sẽ giữu nguyên không thay đổi là 85%.
Mã hóa Huffman thực hiện mã hóa sử dụng ít bít hơn các ký tự có xác suất xuất hiện cao vì chúng được truyền đi thường xuyên hơn và ngược lại,nhiều bit hơn cho các kí tự có xác suất xuất hiện thấp nên có thể tăng được hiệu suất.
Áp dụng thuật toán Huffman, xây dựng từ mã:
Hình 2.5: Ví dụ xây dựng từ mã Huffman
Gọi trọng số của các nút trong cây mã là xác suất của nút đó, ta thấy cây mã Huffman vừa lập là cây mã tối ưu theo nghĩa thứ tự trọng số của các nút tăng dần theo chiều từ dưới lên trên và trái sang phải.
Ta thấy kết pủa mã hóa Huffman của nguồn tin trên như sau:
Ký tự S0 S1 S2 S3 S4 S5 S6 S7
Từ mã 0 110 100 1111 1011 1010 11101 11100 Độ dài từ mã trung bình bây giờ là:
L = 1(0.4) + 3(0.18 + 0.10) + 4(0.10 + 0.07 +0.06) + 5(0.05+0.04) =2.61(bit/ký tự).
Vậy độ lợi mã hóa là:
Qua ví dụ trên ta thấy hiệu suất 85% khi không mã hóa đã tăng lên 97.7% khi mã hóa Huffman.
Ta thấy rằng phương pháp mã hóa Huffman không phải chỉ cho một bộ mã hóa duy nhất, vì ta có thể ký hiệu bất cứ nhánh nào là 0 hay 1 chứ không bắt buộc. Tất nhiên khi đó hiệu suất mà hóa không thay đổi, nhưng thứ tự trọng số của các nút sẽ thay đổi.
Do từ mã Huffman khác nhau đối với các tập ký tự khác nhau nên để bên thu có thể giải mã được thì yêu cầu bên thu phải biết các từ mã liên quan đến dữ liệu phát. Có thể thực hiện điều này bằng hai cách. Hoặc là bên phát gửi bằng mã trước khi phát dữ liệu, hoặc là bên thu phải có sẵn bảng mã.
Phương pháp đầu có ưu điểm là có thể mã hóa nén thích nghi,vì từ mã có thể thay đổi cho phù hợp với kiểu dữ liệu truyền, nhưng có khuyết điểm là phải mất thời gian truyền bảng mã mới mỗi khi gửi kiểu dữ liệu mới.
2.2.5.1.2. Mã hóa Huffman động (dynamic Huffman encoding).
Khác với mã hóa Huffman cơ sở, phương pháp mã hóa Huffman động không
yêu cầu bên phát và bên thu biết bảng mã hóa liên quan đến dữ liệu phát, cũng không yêu cầu kết quả thông kê xác suất xuất hiện ký tự của nguồn tin. Phương pháp mã hóa Huffman động cho phép cả bên phát (mã hóa) và bên thu (giải mã) lập cây mã Huffman và dẫn đến bảng mã một cách động khi ký tự được phát/thu.
Với phương pháp này, nếu ký tự phát đang có mặt trong cây mã thì từ mã tương ứng sẽ được xác định giống mã Huffman cơ sở và gửi đi theo cách thông thường. Nếu ký tự chưa có mặt trong cây mã nghĩa là xuất hiện lần đầu, thì nó sẽ được gửi đi theo dạng không nén. Bộ mã hóa bên phát cập nhật vào cây mã Huffman bằng cách tăng số lần xuất hiện (tăng trọng số) của ký tự phát hoặc là đưa thêm ký tự mới vào cây.
Ngoài ra, để cho bên thu có thể xác định được ký tự mà nó nhận, mỗi từ mã phát được mã hóa theo cùng cách của bên thu. Bên thu tiến hành các thay đổi như bên phát và có một bản sao riêng của cây. Nhờ đó bên thu sẽ xác định đúng từ mã tiếp theo được nhận tùy vào cấu trúc cây mới cập nhật.
Cả bên phát và bên thu đều bắt đầu với một cây mã chỉ có một nhánh trái nhánh 0 và một nút lá rỗng (empty leaf mode) - nút lá có 0 lần xuất hiện.