Thuật toán LZW:

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

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

4.2.2.Thuật toán LZW:

3. 5 PHƯƠNG PHÁP LOẠI TRỪ NHỮN GÔ TRỐNG

4.2.2.Thuật toán LZW:

Thuật toán này là sự chuyển giao của thuật toán LZ78. Như chúng ta đã

biết ở thuật toán LZ78, việc lưu trữ các ký tự theo sau mỗi đoạn thường gây

lãng phí về bộ nhớ nên hiệu quả nén không cao. Thuật toán LZW quản lý bằng cách loại bỏ ký tự sau mỗi đoạn do đó đầu ra của mỗi đoạn chỉ chứa con trỏ mà thôi. Thuật toán này lưu trữ bằng việc chuẩn bị một danh sách các đoạn bao gồm rất nhiều ký tự trong đầu vào là một bảng chữ cái nào đó, nó thực hiện một quá trình mở rộng các bảng chữ cái hay nói cách khác là nó dùng ký tự bổ sung để biểu diễn lại các chuỗi của ký tự chính quy. Để nén LZW trên mã ASCII 8 bits ta cần mở rộng bảng chữ cái bằng cách dùng 9 bits hay nhiều hơn 256 ký tự bổ sung mà mã 9 bits cung cấp được dùng để lưu trữ các chuỗi mã được quyết định từ các chuỗi trong nguồn tin. Thuật toán sẽ không đạt hiệu quả nén cao nếu có những điều kiện sau:

+ Nguồn tin không đồng nhất và đặc tính dư thừa của nó thay đổi trong suốt tập tin.

+ Nguồn tin dài một cách đáng kể vượt quá tầm giới hạn của bảng chuỗi.

Thuật toán nén:

đọc ký tự đầu tiên -> w

Bước 2: While not eof(f) do

Begin Đọc một ký tự -> ch if t=false then w:=w+ch else begin w:=ww+ch;t:=false; end; TIMCHU(w,tl); If tl=false then Begin Code(ư,j); Ghi j ra tệp nén. Thêm w vào từ điển. w:=ch; end else begin ww:=w; t:=true; end;end;

Bước 3: Code(ch), Dừng chương trình.

Thuật toán giải nén:

Bước 1: Đọc thông tin từ điển ở trong tệp nén, đọc byte tiếp theo và giải nén gán vào w, t=false;

Bước 2: While not eof(f) do

Begin

Đọc byte tiếp theo -> b Decode(b,s,t);

If t=true then Begin

Begin

If t=false then w:=w+s(i)

Else begin

w:=ww+s(i); t:=false; end;

TIMCHU(w,t);

If t=false then Begin

Thêm vào từ điển. Ghi ra tệp giải nén. W:=s(i); End;end; End Else Begin Ghi ra tệp giải nén; w:=w+w(i);

thêm w vào từ điển

End; End;

Bước 3: Decode(b,s,t); ghi s ra tệp giải nén. Dừng chương trình.

Đánh giá: Thuật toán LZW đã khắc phục được sự lãng phí về bộ nhớ mà các thuật toán trước không tận dụng được hết. Thuật toán có thời gian chạy chương trình nhanh nếu chúng ta sử dụng cấu trúc cây( nhị phân, tam phân). Một trong những ưu điểm nữa là thuật toán có hiệu quả nén cao.

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