Quá trình giải mã

Một phần của tài liệu nén văn bản tiếng việt theo huffman (Trang 42)

5. Ý nghĩa khoa học của luận văn

2.3.3. Quá trình giải mã

Chương trình đọc từng cặp mã và n hân kí tự nhận được với số lần lặp lại và đưa ra xâu giải mã.

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 ra 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.

Tuy nhiên 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. Đồng thời nếu số kí tự lặp mà lớn thì phải dung số 2B (hoặc 4B) để mô tả L. Lúc này thuật toán không “nén” mà là “bung”.

Biện pháp để cải tiến

Một bộ mã sẽ gồm nhiều nhất là 3 thành phần tuỳ thuộc vào độ lặp của kí tự. Ba thành phần của một bộ mã là:

1. Vị trí của kí tự trong văn bản v ào V là một số nguyên (integer 2B) hoặc số nguyên (dài long 4B) dự phòng trong trường hợp dung lượng văn bản vào vượt quá 32727 kí tự.

2. Số lần lặp lại của kí tự L là một số nguyên 2B vì trên thực tế không một văn bản nào lại lặp tới 32767 kí tự liên tiếp.

3. Kí tự được mã hoá C

Như đã nói ở trên tuỳ thuộc vào số lần lặp mà sử dụng bao nhiêu thành phần cho mã. Nếu với cách mã hoá nói trên để mã hoá có “lãi” thì kí tự phải lặp lại ít nhất 6 lần (vì mất tổng cộng 5B = 2B cho V + 2B cho L + 1B cho C) đối với trường hợp văn bản nhỏ (kích thước văn bản nhỏ hơn 32727B) hay 8 lần đối với những nhóm kí tự bắt đầu tại vị trí lớn hơn 32272 trong các văn bản lớn (vì mất 4B mô tả V thay vì 2B). Do đó trong quá trình mã hoá căn cứ vào vị trí của nhóm kí tự đang xét.

Khi đó thuật toán nén sẽ có những thay đổi. Bản mã có cấu trúc đặc biệt.

Phần Header

3B cho đuôi văn bản được mã hoá N = 4B mô tả số bộ mã

Phần thân chứa bộ mã

V(1): vị trí của nhóm kí tự lặp 1 L(1): độ dài của nhóm lặp 1 V(2): vị trí của nhóm kí tự lặp 2 L(2): độ dài của nhóm lặp 2 ... ... V(N): vị trí của nhóm kí tự lặp N L(N): độ dài của nhóm lặp N

Phần cuối chứa các kí tự ứng với mỗi bước mã hoá.

C(1): kí tự ứng với tần xuất mã thứ nhất C(2): kí tự ứng với tần xuất mã thứ hai ...

Quá trình giải mã diễn ra như sau: 1. Chương trình đọc

a. Đuôi văn bản ban đầu. b. Đọc số bộ mã (N).

c. Lặp N lần: đọc cặp mã thứ i (V(i), L(i)) từ bộ mã vào bộ nhớ. 2. Đặt một biến P (là số long đ ể làm con trỏ vị trí). Khởi tạo P ← 0.

3. Lặp cho đến khi bản mã vẫn còn (biến đếm i từ 1 đến độ dài của bản mã) a. Đọc C(i).

b. P ← P + 1.

c. Vòng lặp (biến đếm j từ 1 đến N)

i. Nếu P = V(j) (có nghĩa là kí tự C(i) đang xét là kí tự đầu tiên của một chuỗi lặp có số lần lặp là L(j)) thì nhân C(i) lên L(j) – 1 lần rồi đưa ra chuỗi kết quả.

ii. Kết thúc vòng lặp ngay (vì chỉ có nhiều nhất một vị trí V(i) = P). d. Viết C(i) ra văn bản giải mã (C(i) này có thể là kí tự cuối cùng của chuỗi

lặp trong trường hợp có lặp hoặc là kí tự có số lần lặp không thoả mãn, tức là không được mã hoá).

Ví dụ:

Có xâu cần mã hoá là aaaaaabbbbbbbbccccccccccdabcbdddddddddddd. Đây là nội dung của một văn bản “.txt” 41B. Khi đó, nén bằng mã RLE theo thuật toán cải tiến thì thu được bản mã nén như sau:

Header Txt 4 Thân bản mã 1 6 7 8 15 10 30 12 Phần cuối a B C D a b c b d

Văn bản nén này có dung lượng 30.

Nhận xét: Thuật toán này thích hợp với các file ảnh vì định dạng của file ảnh có rất nhiều đoạn lặp. Trong quá trình kiểm tra chúng tôi thấy thuật toán này còn có thể nén file .doc cỡ nhỏ rất có hiệu quả vì file này có 19.4KB định dạng ban đầu bao gồm rất nhiều đoạn lặp.

Một phần của tài liệu nén văn bản tiếng việt theo huffman (Trang 42)

Tải bản đầy đủ (PDF)

(81 trang)