2. Mã hoá Huffman
2.62 bit 0.12 log 0.12 0.06 log 0.06 0.04 log 0
0.12 log 0.12 0.06 log 0.06 0.04 log 0.04
× + × + × + × − = + × + × + × 3. Mã hóa số học
Mã hóa Huffman có thể được tối ưu nếu xác suất kí hiệu là một số nguyên lũy thừa của ½, nhưng không phải lúc nào cũng như vậy. Mã hóa số học là kĩ thuật nén dữ liệu mà cho phép mã hóa dữ liệu bằng cách tạo ra một chuỗi mã (code string). Chuỗi này
biểu diễn một giá trị thập phân nằm trong khoảng giữa 0 và 1.
Mô hình là cách tính toán phân bố các xác suất cho kí hiệu tiếp theo sẽ được mã hóa, sao cho bộ giải mã tìm ra được phân bố xác suất y hệt như thế. Có hai loại mô hình được sử dụng trong mã hóa số học:
- Mô hình cố định: Trong mô hình này, cả bộ mã hóa và bộ giải mã biết được xác suất đã gán cho mỗi kí hiệu. Những xác suất này có thể được xác định bằng cách đo đạc các tần số trong các mẫu đại diện sắp được mã và các tần số kí hiệu
- Mô hình thích nghi: xác suất được gán có thể thay đổi khi mỗi kí hiệu được mã hóa, dựa trên các tần số kí hiệu thấy được.
96
Nguyên lý
Ý tưởng cơ bản của mã hóa số học là sử dụng khoảng chia giữa 0 và 1 để biểu diễn các khoảng mã hóa. Rõ ràng hàm mật độ xác xuất tích lũy của tất cả các kí hiệu sẽ bằng 1. Khi bản tin càng dài thì các khoảng để biểu diễn bản tin đó càng ngắn, và số các bít cần để xác định khoảng đó càng tăng. Dựa trên các xác suất kí hiệu tạo ra bởi mô hình, kích thước của các khoảng cho các kí tự tiếp theo của bản tin sẽ giảm.
Để hiểu nguyên lý hoạt động của mã hóa số học, ta xét mã hóa số học mô hình tĩnh. Giả sử các chữ cái là {a, e, i, o, u, !} và mô hình tĩnh được sử dụng với các xác suất như biểu diễn ở Bảng 3.5.
Kí hiệu Xác suất Dải
a 0.2 [0.0, 0.2) e 0.3 [0.2, 0.5) i 0.1 [0.5, 0.6) o 0.2 [0.6, 0.8) u 0.1 [0.8, 0.9) ! 0.1 [0.9, 1.0)
Bảng 3.5: Ví dụMô hình tĩnh cho các chữ cái {a, e, i, o, u, !}
Một khi biết được xác suất tín hiệu, thì mỗi kí hiệu riêng lẻ cần được gán một đoạn của dải [0, 1) mà đoạn đó tương ứng với xác suất xuất hiện của kí tự đó trong hàm mật độ xác suất tích lũy. Chẳng hạn, chữ cái u với xác suất là 0.1, được định nghĩa trong dải tích lũy của [0.8, 0.9) có thể lấy bất cứ giá trị nào từ 0.8 đến 0.8999...
Phần quan trọng nhất của một bản tin được mã hóa số học là việc mã hóa kí tự đầu tiên. Giả sử ta cần mã hóa bản tin eaii!, kí tự đầu tiên cần được mã hóa là e. Do đó, bản
tin được mã hóa cuối cùng phải là một số lớn hơn hoặc bằng 0.2 và nhỏ hơn 0.5. Sau khi kí hiệu đầu tiên đã được mã hóa, ta biết được giá trị biên trên và biên dưới cho dải bản tin đầu ra. Mỗi giá trị mới được mã hóa sẽ càng làm cho dải này hẹp lại.
Kí tự tiếp theo cần được mã hóa là kí tự a nằm trong dải 0-0.2 trong khoảng mới. Đây không phải là kí tự đầu tiên được mã hóa nên nó nằm trong dải tương ứng với 0-0.2 nhưng ở dải con mới [0.2, 0.5). Trong dải con mới có độ dài 0.5 – 0.2 = 0.3 này, dải cho
a là [0.2, 0.26). Tiếp theo, kí tự i được mã hóa, tương tự nó phải nằm trong dải [0.23, 0.236). Cứ tiếp tục như vậy, ta sẽ xây dựng được quá trình mã hóa bản tin như Bảng 3.6 0.236). Cứ tiếp tục như vậy, ta sẽ xây dựng được quá trình mã hóa bản tin như Bảng 3.6 sau đây.
97
Kí tự mới Dải
Khởi tạo [0, 1)
Sau khi xem xét một kí hiệu e [0.2, 0.5)
a [0.2, 0.26)
i [0.23, 0.236)
i [0.233, 0.2336)
! [0.23354, 0.2336)
Bảng 3.6: Biểu diễn quá trình mã hóa số học
Hình 3.43 minh họa một cách biểu diễn khác của quá trình mã hóa.
Hình 3.43: Biểu diễn quá trình mã hóa số học với các khoảng chia tại mỗi giai đoạn cho
bản tin eaii!
Dải cuối cùng thu được, tức là dải [0.23354, 0.2336), biểu diễn bản tin eaii!. Điều đó có nghĩa là nếu ta truyền bất cứ số nào nằm trong dải này, thì số đó đều biểu diễn toàn bộ bản tin eaii!.
Giải mã
Với sơ đồ mã hóa này, tương đối đơn giản để giải mã từng thành phần riêng lẻ của bản tin eaii! Giả sử ta truyền đi số x = 0.23355 (nằm trong dải 0.23354 <= x <0.2336). Bộ giải mã sẽ sử dụng các khoảng xác suất giống như bộ mã hóa và thực hiện quá trình tương tự. Bắt đầu với khoảng khởi đầu [0,1), giá trị 0.23355 nằm trong khoảng [0.2, 0.5) của e. Do vậy, kí hiệu đầu tiên chỉ có thể là e. Tương tự như quá trình mã hóa, các khoảng kí hiệu bây giờ được xác định trong khoảng mới [0.2, 0.5). Điều này tương đương với việc định nghĩa mã đó trong dải khởi tạo [0, 1) nhưng offset mã này bởi giá trị dưới và sau đó lấy tỉ lệ trong dải ban đầu của nó. Như thế, mã mới sẽ là (0.23355-0.2)/(0.5-
98
0.2)=0.11185. Dễ thấy mã này nằm trong khoảng [0, 0.2) của kí hiệu a. Do đó, kí hiệu thứ hai được giải mã là kí hiệu a. Để tìm kí hiệu thứ ba, ta phải tìm mã mới trong dải này, tức là (0.11185-0)/(0.2-0)=0.55925. Giá trị này nằm trong khoảng [0.5, 0.6), ứng với kí
hiệu i, tức là kí hiệu thứ ba được giải mã ra là kí hiệu i. Tiếp tục, ta tìm được mã mới sau khi giải mã kí hiệu thứ ba là (0.55925-0.5)/(0.6-0.5)=0.5925, giá trị này cũng nằm trong khoảng [0.5, 0.6), do đó kí hiệu thứ tư sẽ là i. Lặp lại trình tự như trên, ta được mã mới (0.5925-0.5)/(0.6-0.5)=0.925, nằm trong khoảng [0.9, 1), tương ứng với kí hiệu ! , đây là kí hiệu cuối cùng cần giải, và quá trình giải mã kết thúc. Bảng 3.7 minh họa toàn bộ quá trình giải mã của bản tin eaii!.
Số được mã hóa Kí hiệu đầu
ra Dải 0.23355 e [0.2, 0.5) 0.11185 a [0, 0.2) 0.55925 i [0.5, 0.6) 0.59250 i [0.5, 0.6) 0.925 ! [0.9, 1)
Bảng 3.7:Biểu diễn quá trình giải mã của mã hóa số học
Tổng quát, quá trình giải mã có thể được công thức hóa như sau:
1 n n n n n n n R L R U L + − = − (3.41)
Trong đó Rnlà mã nằm trong dải giá trị dưới Lnvà giá trị trên Un của kí hiệu thứ n
và Rn+1 là mã cho kí hiệu tiếp theo.