Thuật toán Huffman động:

Một phần của tài liệu Nén và xử lý dữ liệu (Trang 37 - 40)

- Thuật toán nén động

4.1.3.Thuật toán Huffman độ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.

Một phần của tài liệu Nén và xử lý dữ liệu (Trang 37 - 40)