a) Thuật toán tạo mã Huffman
5.4.2. Mã RLE (Run Length Encoding)
Đây là một phương pháp nén ảnh phổ biến hiện nay. Nguyên tắc của mã RLE rất đơn giản là thay thế một chuỗi kí tự lặp lại bằng một kí tự duy nhất của chuỗi lặp lại cùng với một biến đếm số lần kí tự đó được lặp lại.
Thuật toán mã hoá
Trong văn bản nguồn có thể có một số kí tự giống nhau, thuật toán sẽ nhóm lại thành một nhóm 2 thành phần (L, C). Trong đó: L là số các từ kế cận giống nhau, C là kí tự được lặp lại.
Thuật toán nén RLE như sau:
Input: Tệp tin nguồn f
Output: Tệp tin nén fn
Các biến: C1, C2 là hai kí tự, L là một số nguyên
a, Bắt đầu:
Bước 1: + Mở tệp tin nguồn f (để đọc) + Mở tệp tin nén fn (để ghi)
Bước 2: + Đặt L=1;
+ Đọc kí tự trong bản mã gán vào C1;
Bước 3: Khi nào C1 không phải là ký tự cuối cùng trong tệp f thì thực hiện:
b1. Đọc kí tự tiếp theo trong bản mã gán vào C2
b2. Kiểm tra, nếu C1 = C2 thì + Tăng L=L+1;
+ Quay lên thực hiện tiếp b1; Ngược lại thì:
+ Ghi cặp (L, C1) ra tệp nén fn. + Quay lên thực hiện tiếp Bước 3:
Ngược lại, nếu (C1 là ký tự cuối cùng trong tệp f mã) thì thực hiện Bước 4:
Bước 4: Kết thúc.
Có một văn bản sau: aaaabbbaabbbbbccccccccdabcbaaabbbbcccd. Theo phương pháp mã RLE thì văn bản này được mã hoá như sau:
4a3b2a5b8c1d1a1b1c1b3a4b3c1d. Thuật toán giải nén
b, Thuật toán giải nén RLE như sau:
Input: Tệp tin nguồn nén fn
Output: Tệp tin giải nén fg
Bước 1: + Mở tệp tin nén fn (để đọc) + Mở tệp tin giải nén fg (để ghi)
Bước 2:
Khi nào cặp (L,C) không phải là ký tự cuối cùng trong tệp fn thì thực hiện:
b1. Đọc cặp (L,C) trong tệp nén fn
b2. + For i=1 to L do ghi ký tự C ra tệp giải nén fg + Quay lên thực hiện tiếp Bước 2:
Ngược lại, (L, C là cặp ký tự cuối cùng trong tệp nén fc) thì thực hiện
Bước 3: Bước 3: Kết thúc
b, Ví dụ:
Có bản mã 4a3b2a5b8c1d1a1b1c1b3a4b3c1d thì quá trình giải mã như sau: Đọc được cặp mã đầu tiên là 4a thì ta viết aaaa, tiếp theo là cặp mã 3b thì ta viết ra tiếp bbb. Cứ lặp lại như vậy cho đến khi đọc hết các cặp mã ta được văn bản ban đầu là aaaabbbaabbbbbccccccccdabcbaaabbbbcccd.
Nhận xét: Thuật toán trên có hạn chế là nếu kí tự không lặp lại thì lại tốn ít nhất 2B (1B số, 1B kí tự) để mô tả một kí tự 1B. Lúc này thuật toán không “ nén” mà là “bung”.