- Thuật toán nén động
3. 5 PHƯƠNG PHÁP LOẠI TRỪ NHỮN GÔ TRỐNG
4.1.3. Thuật toán Huffman động:
Trong thuật toán Huffman động chúng ta sử dụng hai cây nhị phân cân và một của sổ χ.
Khái niệm cửa sổ χ:
Cửa sổ χ là một số lượng rất lớn các ký tự được thêm vào cây nhị phân
Huffman trong quá trình nén văn bản.
Trong quá trình nén dữ liệu, ta tiến hành thống kê các ký tự. Nhờ việc thống kê này mà sinh ra bộ nén.
Thuật toán nén:
Bước 1: Khởi tạo bảng mã Huffman(front tree) với ký tự đặc biệt, có số đếm bằng 1.
Bước 2: Tạo mã thứ tự theo nguyên tắc cân bằng.
Bước 3: While not eof(f) do
Begin
Getchar-> ch
If ch thuộc bảng mã thứ tự then
Begin
Ghi mã 0/1 của ký tự đó và ký tự đặc biệt ra tệp đích
Xóa ký tự đó ở bảng mã thứ tự, thêm ký tự đó vào bảng mã Huffman (trong cây front tree) với số đếm bằng 1.
End Else Begin
If ch thuộc bảng mã Huffman then
Begin
Tăng số đếm của ký tự đó lên một đơn vị
If số đếm của ký tự đó lớn hơn số đếm của ký tự ngay trên nó then
Begin
Đổi chỗ hai ký tự đó
End;
Ghi mã 0/1 của ký tự đó và ký tự đặc biệt ra tệp đích
End;
If số lượng ký tự trong bảng mã Huffman>=χthen
Begin
Tìm một ký tự, giảm số đếm của ký tự đó đi một đơn vị
If dưới ký tự đó là ký tự đặc biệt then
Giảm số đếm của ký tự đặc biệt đi một đơn vị
Begin
If số đếm của ký tự sau khi giảm < số đếm của ký tự dưới nó then
Begin
Đổi chỗ
End; End;
If số đếm của ký tự đó bằng không then
Begin
Loại ký tự đó ra khỏi bảng mã Huffman. Tăng số lượng ký tự ở cây thứ tự lên một. Giảm số lượng ký tự ở cây Huffman đi một.
Thêm ký tự vừa loại ra khỏi bảng mã Huffman đó và bảng mã thứ tự ở vị trí đầu tiên.
End;
Tạo lại bảng mã thứ tự, mã Huffman cho bảng mã Huffman theo nguyên tắc cân bằng.
End;
Bước 4: Dừng chương trình.
Thuật toán giải nén:
Bước 1: Khởi tạo bảng mã thứ tự theo nguyên tắc cân bằng
Bước 2: While not eof(f) do
Begin
Lấy ra lần lượt từng ký tự và gán chuỗi ư cho đến khi gặp ký tự đặc biệt.
Begin
Tra trong bảng mã thứ tự và ghi ký tự đó ra tệp đích. Thêm ký tự đó vào bảng mã Huffman với số đếm bằng 1.
End;
If ký tự đặc biệt đó chỉ tới bảng mã Huffman then
Begin
Tra trong bảng mã Huffman và ghi ký tự đó ra tệp đích. Tăng số đếm của ký tự lên 1 đơn vị.
If số đếm của ký tự đó lớn hơn số đếm của ký tự trên nó then
Begin
Đổi chỗ.
End; End;
If số lượng ký tự trong bảng mã Huffman>=χthen
Begin
Tìm ký tự nào đó giảm đi 1 đơn vị.
If số đếm của ký tự đó < số đếm của ký tự đứng trước nó then
Begin
If bên dưới nó là ký tự đặc biệt then
Giảm số đếm của ký tự đặc biệt đó đi 1. Đổi chỗ hai ký tự đó.
End;
If số đếm của ký tự đó sau khi giảm đi 1 bằng không then
Begin
Tăng số lượng ký tự ở cây thứ tự lên một. Giảm số lượng ký tự ở cây Huffman đi một. Loại ký tự đó ra khỏi bảng mã Huffman. Thêm ký tự vừa loại ra vào bảng mã thứ tự.
End;
Tạo lại mã cho bảng mã thứ tự, bảng mã Huffman theo nguyên lý cân bằng.
End;
Đánh giá: Quá trình mã và giải mã tương đối chậm do phải xây dựng cây nhị
phân ứng với dữ liệu nhập. Thuật toán nén Huffman thường được dùng để
nén các tệp dạng văn bản, các tệp có kích thước lớn.