5. Ý nghĩa khoa học của luận văn
2.2.3. Thuật toán giải nén
Vấn đề giải mã tương tự như mã hóa, các quy tắc lập cây Huffman ở quá trình mã hóa và giải mã buộc phải giống nhau. Hai quá trình mã hóa và giải mã ở phương pháp này đều tuân quy tắc đọc từng ký tự một, cập nhật và xây dựng cây Huffman ngay sau mỗi lần đọc.
Khởi tạo, cây Huffman chỉ có một nút lá là shift (ký tự đặc biệt không có trong bảng chữ cái).
Đọc lần lượt từng ký tự từ chuỗi mã hóa, duyệt cây Huffman đến khi gặp một lá ngoài cùng.
o Nếu lá này biểu diễn shift thì có thể khẳng định chuỗi bit đằng sau biểu diễn một chữ cái xuất hiện lần đầu tiên, và chiều dài của chuỗi bit này là biết trước (chính là mã thực tế của ký tự khi chưa mã hóa).
o Nếu lá biểu diễn một chữ cái, thì cho giải ra chữ cái ấy.
o Cập nhật lại cây nhị phân, có thể một nút mới sinh ra hoặc thay đổi trọng số của một nút đã tồn tại.
Ví dụ: Sau quá trình mã hóa với chuỗi đầu vào “ABBAC” kết quả cho
xâu: 0g(A)0g(B)10100g(C). Trên thực tế, những ký hiệu g(si) là một chuỗi nhị phân của biểu diễn ký tự trong bảng chữ cái ban đầu. (Ví dụ, biểu diễn mã ANSI của một ký tự bất kỳ trong bảng chữ cái sẽ là 8 bit).
Khởi tạo, cây Huffman chỉ có một nút lá là , đây là nút nằm bên trái nút gốc, có mã Huffman là 0. Đọc xâu mã hóa, được bit 0 , giải được , suy ra cho phép đọc liên tiếp một chuỗi gồm nhiều ký tự có độ dài biết trước để giải ra ký tự gốc trong bảng chữ cái (ví dụ nếu là bảng mã ANSI thì cho phép đọc 8 bit liền để giải). Đồng thời cây Huffman được cập nhật thêm một phần tử mới, có trọng số của phần tử này bằng 1. Quá trình được thực hiện y hệt khi đọc tiếp được 0 (biểu diễn
) và g(B), cho phép giải ra B. Tiếp tục đọc được 1, duyệ t cây nhị phân, tới lá, cho giải ra B, trọng số của B tãng thêm 1. Đọc bit 0 tiếp theo, chưa duyệt tới lá, tiếp tục đọc và duyệt cây nhị phân cho bit 1, giải được ký tự A, lập tức, trọng số của A được nâng thêm 1, cây Huffman phải cập nhật lại. Ở lần duyệt cuối cùng, 00 biểu diễn
, giải được ký tự C.
STT Input Output Bảng chữ cái Dựng cây
0 {}
1 0g(A) A {,A(1)}
3 1 B {,A(1),B(2)}
4 01 A {,A(2),B(2)}
5 00g(C) C {,C(1),A(2),B(2)}
Hình 11. Giải mã bằng phương pháp Huffman động
Thuật toán:
1. Khởi tạo cây Huffman T với nút SHIFT duy nhất 2. while more bits remain do
3. s huffman_next_sym () 4. if s = SHIFT then 5. s read_unencoded_sym () 6. else 7. output s 8. end if 9. T update_tree(T) 10. end while
Đánh giá thuật toán mã hóa Huffman động:
Lợi thế của thuật toán này là không cần có quá trình đọc trước toàn bộ tệp đầu vào, nhưng phải trả giá cho quá trình xây dựng cây Huffman, ngay khi đọc được một ký tự, lập tức cây lại phải dựng lại, điều này phiền phức trong trường hợp bảng chữ cái lớn.
Hơn nữa, cũng giống như thuật toán mã hóa Huffman, phương pháp chưa đạt được hiệu quả tối ưu khi tần số xuất hiện các chữ cái không phải là một lũy thừa của 2. Nếu sử dụng phương pháp ghép nhóm các ký tự lại để khắc phục, thì lập tức bảng chữ cái lại bị mở rộng thêm.