Tuyển tập Báo cáo “Hội nghị Sinh viên Nghiên cứu Khoa học” lần thứ 6 Đại học Đà Nẵng - 2008 258
NGHIÊN CỨU CÁC THUẬT TOÁN NÉN
DỮ LIỆU THUẬT TOÁN LZW
RESEARCH ALGORITHMS OF DATA COMPRESS
LZW ALGORITHM
SVTH: PHẠM TUẤN ANH
Lớp: 05CCT2 Khoa Tin, Trường Đại học Sư Phạm
GVHD: ĐOÀN DUY BÌNH
Khoa Tin, Trường Đại học Sư Phạm
TÓM TẮT
Có khá nhiều kỹ thuật nén dữ liệu như: dùng mã ký hiệu, mã đóng gói, mã theo độ dài, nén dữ
liệu với mô hình nguồn, kỹ thuật từ điển… Trong số các kỹ thuật trên thì kỹ thuật từ điển là linh
hoạt và hiệu quả hơn cả. Đặc biệt là dùng mã LZ với từ điển động, và phổ biến hơn hết là
phương pháp nén LZW. Bài báo cáo này giới thiệu một số thuật toán nén dữ liệu và trình bày
phương pháp nén LZW.
ABSTRACT
There are many method compress data, such as: use sysbol code, packed code, length code,
compress data with source model and dictionary technonogy… In that, dictionary technonogy
is activityer and effectiver. Special is method use LZ with dynamic dictionary, and popular is
method LZW compress. This report introduce some algorithm of data compression and
execute LZW compress method.
1. Mở đầu:
Trong các lĩnh vực của công nghệ thông tin – viễn thông hiện nay, việc truyền tải tin
tức đã là một công việc xảy ra thường xuyên. Tuy nhiên thông tin được truyền tải đi thường rất
lớn, điều này gây khó khăn cho công việc truyền tải: gây tốn kém tài nguyên mạng, tiêu phí
khả năng của hệ thống… Để giải quyết vấn đề đó, các thuật toán nén đã được ra đời.
2. Nội dung:
Phương pháp mã hóa Huffman
2.1.1. Nguyên lý:
Nguyên lý của phương pháp Huffman là mã hóa các bytes trong tệp dữ liệu nguồn
bằng biến nhị phân. Nó tạo mã độ dài biến thiên là một tập hợp các bits. Đây là phương pháp
nén kiểu thống kê, những ký tự xuất hiện nhiều hơn sẽ có mã ngắn hơn
2.1.2. Thuật toán:
Thuật toán nén:
Bước 1: Tìm hai ký tự có trọng số nhỏ nhất ghép lại thành một, trọng số của ký tự mới
bằng tổng trọng số của hai ký tự đem ghép.
Bước 2: Trong khi số lượng ký tự trong danh sách còn lớn hơn một thì thực hiện bước
một, nếu không thì thực hiện bước ba.
Bước 3: Tách ký tự cuối cùng và tạo cây nhị phân với quy ước bên trái mã 0, bên phải
mã 1.
Thuật toán giải nén:
Bước 1: Đọc lần lượt từng bit trong tập tin nén và duyệt cây nhị phân đã được xác định
cho đến khi hết một lá. Lấy ký tự ở lá đó ghi ra tệp giải nén.
Bước 2: Trong khi chưa hết tập tin nén thì thực hiện bước một, ngược lại thì thực hiện
bước 3.
Bước 3: Kết thúc thuật toán.
Một số những hạn chế của mã Hufman:
Mã Huffman chỉ thực hiện được khi biết được tần suất xuất hiện của các ký tự.
Mã Huffman chỉ giải quyết được độ dư thừa phân bố ký tự.
Huffman tĩnh đòi hỏi phải xây dựng cây nhị phân sẵn chứa các khả năng. Điều này
đòi hỏi thời gian không ít do ta không biết trước kiểu dữ liệu sẽ được thực hiện nén.
Quá trình giải nén phức tạp do chiều dài mã không biết trước cho đến khi ký tự đầu
tiên được tìm ra.
Phương pháp mã hóa LZ78
Thay vì thông báo vị trí đoạn văn lặp lại trong quá khứ, mã LZ78 đánh số tất cả các
đoạn văn sao cho mỗi đoạn ghi nhận số hiệu đoạn văn lặp lại trong quá khứ cộng với một
Đọc byte tiếp theo -> b
Decode(b,s,t);
If tl=false then w:=w+s
Else w:=ww+s;
TIMCHU(w,t);
If t=false then
Begin
Ghi s ra tệp giải nén
Thêm s vào từ điển
End
Else Begin
ww:=s;
End;
End;
Bước 3: Dừng chương trình.
Đánh giá: Nói chung thuật toán LZ78 là một thuật toán nén văn bản khá tốt, có thời
gian chạy chương trình tương đối nhanh tuy nhiên khả năng tiết kiệm chưa được khai thác
tốt đa.
Phương pháp mã hóa 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 chưa 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:
Tuyển tập Báo cáo “Hội nghị Sinh viên Nghiên cứu Khoa học” lần thứ 6 Đại học Đà Nẵng - 2008
Đọc byte tiếp theo ->b
Decode(b,s,t);
If t=true then
Begin
For i:=1 to length(s) do
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
Tuyển tập Báo cáo “Hội nghị Sinh viên Nghiên cứu Khoa học” lần thứ 6 Đại học Đà Nẵng - 2008 262
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.
3. 3. Kết luận:
Các phương pháp khác kết quả mã hóa trả về là bộ đôi <i,S>; i là một con trỏ chỉ số