Tải bản đầy đủ (.pdf) (79 trang)

Thuật toán nén tệp thực thi BDC và ứng dụng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.47 MB, 79 trang )

i
ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN & TRUYỀN THÔNG

NGUYỄN HỮU HIẾU

THUẬT TOÁN NÉN TỆP THỰC THI BDC
VÀ ỨNG DỤNG

LUẬN VĂN THẠC SỸ KHOA HỌC MÁY TÍNH

Thái Nguyên - 2016

Số hóa bởi Trung tâm Học liệu – ĐHTN




ii
ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN & TRUYỀN THÔNG

NGUYỄN HỮU HIẾU

THUẬT TOÁN NÉN TỆP THỰC THI BDC
VÀ ỨNG DỤNG
Chuyên ngành: Khoa học máy tính
Mã số: 60480101

LUẬN VĂN THẠC SỸ KHOA HỌC MÁY TÍNH
NGƯỜI HƯỚNG DẪN KHOA HỌC



PGS.TS NGUYỄN VĂN TAM

Thái Nguyên – 2016

Số hóa bởi Trung tâm Học liệu – ĐHTN




i

LỜI CAM ĐOAN
Tôi xin cam đoan rằng:
Số lượng và kết quả nghiên cứu trong luận văn này là hoàn toàn trung
thực và chưa từng được sử dụng hoặc công bố trong bất cứ công trình nào
khác.
Mọi sự giúp đỡ cho việc thực hiện luận văn này đã được cảm ơn và các
thông tin trích dẫn trong luận văn đều được ghi rõ nguồn gốc.
Tác giả luận văn

Nguyễn Hữu Hiếu

Số hóa bởi Trung tâm Học liệu – ĐHTN




ii


LỜI CẢM ƠN
Lời đầu tiên học viên xin gửi lời cảm ơn trân thành tới các Thầy, Cô
giáo trường Đại học Công nghệ thông tin và Truyền thông, Đại học Thái
Nguyên, các thầy cô đã tận tình dạy bảo, truyền đạt các kiến thức quý báu cho
học viên trong suốt quá trình học tập.
Xin trân trọng cảm ơn Khoa, Phòng, Ban và các cán bộ đã tạo điều kiện tốt
nhất cho học viên học tập và hoàn thành đề tài tốt nghiệp của mình.
Đặc biệt, học viên xin được gửi lời cảm ơn sâu sắc đến Thầy giáo hướng dẫn
học viên PGS. TS Nguyễn Văn Tam, Thầy đã tận tình chỉ bảo giúp đỡ học
viên trong suốt quá trình nghiên cứu để hoàn thành luận văn.
Cuối cùng học viên xin gửi lời cảm ơn gia đình, bạn bè, đồng nghiệp đã
giúp đỡ, động viên ủng hộ học viên rất nhiều trong toàn bộ quá trình học
tập cũng như nghiên cứu để hoàn thành luận văn này.
Trân trọng cảm ơn!

Số hóa bởi Trung tâm Học liệu – ĐHTN




iii

MỤC LỤC
MỞ ĐẦU ........................................................................................................... 1
1. Đặt vấn đề...................................................................................................... 1
2. Đối tượng và phạm vi nghiên cứu:................................................................ 1
3. Ý nghĩa khoa học, thực tiễn của đề tài: ......................................................... 2
4. Phương pháp nghiên cứu:.............................................................................. 2
5. Bố cục của luận văn: ..................................................................................... 2
CHƯƠNG I ....................................................................................................... 3

GIỚI THIỆU CHUNG VỀ MỘT SỐ CÔNG NGHỆ NÉN .............................. 3
1.1. Tầm quan trọng của nén dữ liệu trong truyền tin ....................................... 3
1.2. Nguyên tắc nén dữ liệu .............................................................................. 4
1.3. Một số phương pháp nén dữ liệu ............................................................... 4
1.3.1. Phương pháp mã hóa độ dài loạt (Run - Length Encoding) ................... 4
1.3.2. Phương pháp mã hóa Huffman ............................................................... 5
1.3.3. Phương pháp nén LZW ........................................................................... 9
1.3.4. Chọn phương pháp nén ......................................................................... 15
Kết luận: ......................................................................................................... 16
CHƯƠNG 2..................................................................................................... 17
CÔNG NGHỆ NÉN DELTA .......................................................................... 17
2.1. Giới thiệu về công nghệ nén Delta ........................................................ 17
2.1.1. Khái niệm về nén .................................................................................. 17
2.1.2. Bộ nén Delta ......................................................................................... 18
2.1.3. Tính hiệu quả......................................................................................... 18
2.2. Nền tảng ................................................................................................... 19
2.2.1. Nền tảng chung ..................................................................................... 19
2.2.2. Bộ nén LZ77- Nền tảng của bộ nén Delta ............................................ 21
Số hóa bởi Trung tâm Học liệu – ĐHTN




iv

2.3. Thuật toán nén Delta ................................................................................ 24
2.3.1. Nguyên lý của thuật toán nén Delta .................................................... 24
2.3.2. Giới thiệu ............................................................................................... 25
2.3.3. Đặt vấn đề............................................................................................ 27
2.3.4. Những nghiên cứu đầu tiên ................................................................... 28

2.3.5. Thuật toán cơ bản .................................................................................. 30
2.3.6. Sự cải tiến và độ phức tạp của thuật toán ........................................... 35
2.3.7. Xây dựng lại xâu đích ........................................................................... 37
2.4. Giải pháp nén Delta dựa trên chữ ký ....................................................... 38
2.4.1. Thuật toán nén Delta dựa trên chữ ký ................................................... 38
2.4.2. Đánh giá thuật toán qua thực thi rsync ................................................. 40
2.5. Một số ứng dụng của thuật toán nén Delta .............................................. 41
Kết luận: ......................................................................................................... 44
CHƯƠNG 3..................................................................................................... 45
CHƯƠNG TRÌNH THỬ NGHIỆM ................................................................ 45
3.1. Bộ công cụ mã nguồn mở cho giải thuật nén Delta ................................. 45
3.1.1. Thư viện nén Delta: librsync ................................................................. 45
3.1.2. Hàm thư viện: rdiff................................................................................ 46
3.2. Xây dựng chương trình thử nghiệm ......................................................... 50
3.2.1. Mô hình thử nghiệm .............................................................................. 50
3.2.2. Xây dựng chương trình ........................................................................ 51
3.2.2.1. Module chương trình trên máy chủ ............................................... 51
3.2.2.2. Module chương trình trên máy khách ........................................... 53
3.2.3. Kịch bản thử nghiệm và đánh giá ......................................................... 54
Kết luận: ......................................................................................................... 55
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ...................................................... 56
A. Kết luận: ..................................................................................................... 56
Số hóa bởi Trung tâm Học liệu – ĐHTN




v

B. Hướng phát triển ......................................................................................... 56

TÀI LIỆU THAM KHẢO ............................................................................... 58
PHỤ LỤC ........................................................................................................ 59

Số hóa bởi Trung tâm Học liệu – ĐHTN




vi

DANH MỤC CÁC KÝ HIỆU, CÁC CHỮ VIẾT TẮT
Từ viết tắt

Tiếng anh

API

Application Programming Interface

BDC

Binary Delta Compression

COM

Component Object Model

DOS

Disk Operating System


HTTP

Hyper Text Transfer Protocol

LCS

Longgest common Subsequence

LZW

Lempel-Zip- Welch

MD5

Message Digest Algorithm 5

QAM

Quadrature Amplitude Modulation

Số hóa bởi Trung tâm Học liệu – ĐHTN




vii

DANH MỤC CÁC BẢNG
Bảng 1.1. Mô tả các trường hợp xuất hiện các ký hiệu khi nén........................ 5

Bảng 1.2. Mô tả các thông tin với mã Huffman ............................................... 7
Bảng 2.1. Các kết quả nén cho bộ dữ liệu gcc và emacs ................................ 24
Bảng 2.2. kết quả nén cho gcc và emacs bộ dữ liệu trong KB ....................... 41
Bảng 2.3. Kết quả nén cho emacs với kích thước block khác nhau trong KB ... 41
Bảng 3.1. Tên tệp và kích thước thử nghiệm trong chương trình ................... 69

Số hóa bởi Trung tâm Học liệu – ĐHTN




viii

DANH MỤC CÁC HÌNH VẼ
Hình 1.1. Phương pháp nén RLE(1) ................................................................. 5
Hình 1.2. Phương pháp nén RLE(2) ................................................................. 5
Hình 1.3. Mã hóa Huffman ............................................................................... 7
Hình 1.4. Mã hóa Huffman ngược .................................................................... 8
Hình 2.1. Bộ nén dữ liệu thông thường........................................................... 17
Hình 2.2. Bộ nén Delta .................................................................................... 18
Hình 2.3. Mô hình cập nhật Windows ............................................................ 43
Hình 3.1. Lưu đồ thuật toán cho thư viện hàm rdiff_sig ................................ 47
Hình 3.2. Lưu đồ thuật toán cho thư viện hàm rdiff_Delta ........................... 48
Hình 3.3. Lưu đồ thuật toán cho thư viện hàm rdiff_patch ............................ 49
Hình 3.4. Mô hình thử nghiệm ........................................................................ 50
Hình 3.5. Chương trình trên server ................................................................. 51
Hình 3.6. Tạo tệp chữ ký bên máy chủ ........................................................... 52
Hình 3.7. Tạo tệp mới bên máy chủ ................................................................ 52
Hình 3.8. Tạo Delta giữa tệp cũ và mới bên chương trình máy chủ ............... 53
Hình 3.9. Chương trình dành cho máy khách ................................................. 53

Hình 3.10. Tạo tệp cập nhật bên máy khách ................................................... 54
Hình 3.11. Sự đối lập của kích thước nén tập tin và sự giống nhau giữa tập tin ..... 68
Hình 3.12. Sự đối lập giữa thời gian thực hiện và sự giống nhau của tập tin ....... 69

Số hóa bởi Trung tâm Học liệu – ĐHTN




1

MỞ ĐẦU
1. Đặt vấn đề
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 diễn 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.
Mỗi phương pháp nén có hiệu quả khác nhau với các loại tệp khác
nhau. Luận văn này sẽ trình bày một phương pháp nén có hiệu quả cao trong
công việc truyền tải tệp tin trên mạng phục vụ cho việc cập nhật phiên bản
mới của tệp tin. Phương pháp dựa trên sự sai khác nhau giữa tệp nguồn và tệp
đích (gọi là Differential Compression – hay Binary Delta Compression).
Trong quá trình cập nhật, tệp nguồn là tệp cũ, tệp đích là tệp mới và tạo ra
một bản vá có kích thước nhỏ đáng kể so với tệp đích. Khi đó, thay vì phải
truyền tệp đích có kích thước lớn trên mạng, ta chỉ cần truyền bản vá có kích
thước rất nhỏ. Phương pháp đã đạt được tỉ lệ nén cao, rất hiệu quả trong việc
tiết kiệm tài nguyên mạng. Nếu tỷ lệ nén cho các tệp thực thi thường dao
động quanh 3:1 thì tỷ lệ nén của bản vá so với tệp đích theo phương pháp nén
Delta có thể nằm trong khoảng từ 10:1 tới 1000:1 và thậm chí có thể lớn hơn

còn tùy thuộc vào dung lượng tệp đích và mức độ khác biệt của nó với tệp
nguồn.
Luận văn trình bày ứng dụng của phương pháp nén trong việc cập nhật
và nâng cấp phần mềm. Do đó, ho ̣c viên lựa cho ̣n đề tài luâ ̣n văn Tha ̣c sỹ “
Thuật toán nén tệp thực thi BDC và ứng dụng”
2. Đối tượng và phạm vi nghiên cứu:
a. Đối tượng nghiên cứu
Thuật toán nén tệp thực thi BDC ( Binary Delta Compression)
b. Phạm vi nghiên cứu
Nghiên cứu nén tệp thực thi Binary Delta
Số hóa bởi Trung tâm Học liệu – ĐHTN




2

3. Ý nghĩa khoa học, thực tiễn của đề tài:
- Ý nghĩa khoa học: Hiểu được ứng dụng của Thuật toán nén tệp thực
thi BDC (Binary Delta Compression) và các ứng dụng với truyền tệp tin qua
mạng máy tính.
- Ý nghĩa thực tiễn: Vận dụng các phương pháp nghiên cứu để giải
quyết một bài toán về truyền tập tin qua mạng, đó là thuật toán nén tệp thực
thi (Binary Delta Compression). Kết quả này có thể hoàn thiện, triển khai và
ứng dụng trong thực tiễn.
4. Phương pháp nghiên cứu:
- Nghiên cứu các kết quả đã công bố trong lĩnh vực nén tệp thực thi và
truyền tin qua mạng, thuật toán nén tệp thực thi Delta trong quản trị mạng.
- Phân tích, tổng hợp, đánh giá các kết quả.
- Phân tích lý thuyết và xây dựng chương trình để thử nghiệm bài toán.

5. Bố cục của luận văn:
Luận văn được trình bày thành các chương như sau:
Chương 1: GIỚI THIỆU CHUNG VỀ MỘT SỐ CÔNG NGHỆ NÉN
Chương 2: CÔNG NGHỆ NÉN DELTA
Chương 3: CHƯƠNG TRÌNH THỬ NGHIỆM

Số hóa bởi Trung tâm Học liệu – ĐHTN




3

CHƯƠNG I
GIỚI THIỆU CHUNG VỀ MỘT SỐ CÔNG NGHỆ NÉN
1.1. Tầm quan trọng của nén dữ liệu trong truyền tin
Ngày nay với sự phát triển của Internet. Việc truyền tải thông tin liên
lạc, cập nhật hay nâng cấp phần mềm diễn ra là rất lớn, trao đổi hàng ngày
liên tục và thường xuyên. Đã có nhiều phương pháp nén đã ra đời. Tuy nhiên
để tăng tốc độ truyền, ta có thể dùng nhiều phương pháp như sử dụng:
Tăng bộ nhớ đệm, tăng gói dữ liệu truyền đi, cấu hình DNS, tăng băng
thông cho Windows, tăng tốc card mạng...
Nén dữ liệu trước khi truyền đi cũng là một trong các phương pháp
nhằm tăng tốc độ truyền dữ liệu. Trong các modem hiện đại, việc thực hiện
nén dữ liệu trước khi truyền đi có thể được thực hiện ngay trong modem theo
các giao thức V42bis. Phương pháp này đòi hỏi hai modem phải có cùng một
giao thức nén dữ liệu, điều này nhiều khi khó thoả mãn.
Có một phương pháp nén khác là thực hiện nén các tập tin ngay tại các
máy tính trước khi truyền đi:
- Tại các máy tính bên phía nhận, các tập tin lại được giải nén để phục

hồi lại dạng ban đầu. Phương pháp này có ưu điểm là bên phát và bên thu chỉ
cần có chung phần mềm nén và giải nén, ngoài ra còn có thể áp dụng được để
truyền dữ liệu qua các modem không hỗ trợ nén dữ liệu hoặc truyền dữ liệu
trực tiếp qua cổng COM của máy tính. Nhược điểm của phương pháp này là
các máy vi tính phải tốn thêm thời gian nén và giải nén. Nhưng do sự phát
triển nhanh chóng của các bộ vi xử lý mà thời gian thực hiện nén và giải nén
được giảm nhỏ hơn rất nhiều thời gian để truyền dữ liệu. Ví dụ, khi truyền
một tập tin có kích thước là 100Kbyte là: 8 bits dữ liệu, 2 bit STOP và 1 bit
START, không dùng bit chẵn lẻ, tốc độ truyền là 9600bits/giây thì mất
khoảng 120 giây, trong khi một máy vi tính với bộ vi xử lí 80386 có thể thực
Số hóa bởi Trung tâm Học liệu – ĐHTN




4

hiện nén tập tin trên xuống còn 50Kbyte chỉ mất chưa đến 10 giây.
1.2. Nguyên tắc nén dữ liệu
Thông thường, hầu hết các tập tin trong máy tính có rất nhiều thông
tin dư thừa, việc thực hiện nén tập tin thực chất là mã hóa lại các tập tin để
loại bỏ các thông tin dư thừa.
Nhìn chung không thể có phương pháp nén tổng quát nào cho kết quả
tốt đối với tất cả các loại tập tin vì nếu không ta sẽ áp dụng n lần phương
pháp nén này để đạt được một tập tin nhỏ tùy ý. Kĩ thuật nén tập tin thường
được áp dụng cho các tập tin văn bản ( trong đó có một số kí tự nào đó có xác
suất xuất hiện nhiều hơn các kí tự khác)
Các tập tin ảnh mà có thể có những mảng lớn đồng nhất. Các tập tin
dùng để biểu diễn âm thanh dưới dạng số hóa và các tín hiệu tương tự (analog
signal) khác: Các tín hiệu này có thể có các mẫu được lặp lại nhiều lần.

Đối với các tập tin nhị phân như tập tin chương trình thì sau khi nén
cũng không tiết kiệm được nhiều.
Ngoài ra, trong một số trường hợp để nâng cao hệ số nén người ta có
thể bỏ bớt một số thông tin của tập tin.
1.3. Một số phương pháp nén dữ liệu
1.3.1. Phương pháp mã hóa độ dài loạt (Run - Length Encoding)
Phương pháp mã hóa độ dài loạt RLE (Run Length Encoding) là
phương pháp mã hóa độ dài ký hiệu. Thuật toán này nhận biết các ký hiệu
xuất hiện thường xuyên liên tục và ghi nhận độ dài của các ký hiệu này. RLE
rất có hiệu quả trong nén dữ liệu đối với dữ liệu xuất hiện liên tiếp các ký hiệu
như hình ảnh; Trong hình ảnh, ví dụ như màu nền của một bức tranh có rất
nhiều màu trùng nhau đứng cạnh nhau. Còn trong văn bản thì rất ít xuất hiện
liên tiếp ký hiệu.
Số hóa bởi Trung tâm Học liệu – ĐHTN




5

Ý tưởng chính của phương pháp RLE rất đơn giản, nếu có ''aaaaaaa"
thì kết xuất ra "a" và số lần xuất hiện ký hiệu này.

aaaaaaa

a

RLE

6 lần


a

6

3 byte

Hình 1.1. Phương pháp nén RLE(1)
Ở đây byte thứ ba trong dữ liệu nén là ký hiệu có số thứ tự trong bảng
mã là 6. Có nghĩa là ta coi số lần ký hiệu lặp là một byte nếu số lần lặp nhỏ
hơn 256. Nếu số lần lặp là lớn hơn 256 thì ta kết xuất ký hiệu gốc và số lần
lặp là 255, sau đó phải ghi nhận số lần lặp mới với ký hiệu gốc này. Điều này
minh họa như sau:

Hình 1.2. Phương pháp nén RLE(2)
Vấn đề nảy sinh đối với các ký hiệu không lặp lại thì ta không nén
chúng. Trong bảng mô tả chi tiết với các trường hợp xuất hiện ký hiệu khác
nhau[3]:
Bảng 1.1. Mô tả các trường hợp xuất hiện các ký hiệu khi nén
Dữ liệu nguồn

Dữ liệu nén

Aaaaaa

aa4

Aa

aa0


Bc

bc

1.3.2. Phương pháp mã hóa Huffman
Số hóa bởi Trung tâm Học liệu – ĐHTN




6

Mã hóa theo phương pháp Huffman là một thuật toán dùng để nén dữ
liệu:
Nó dựa trên bảng tần suất xuất hiện các kí tự cần mã hóa để xây dựng
một bộ mã nhị phân cho các kí tự đó sao cho dung lượng bit sau khi mã hóa là
nhỏ nhất.
- Mã Huffman là chuỗi nhị phân được sinh ra dựa trên cây Huffman, là
một cây nhị phân với các tính chất:
- Mỗi ký tự được biểu diễn bằng một nút lá
- Mã cho một ký tự được lấy thông qua đường dẫn từ gốc đến nút lá đó,
đi sang trái ta nhận được bit 0, sang phải bit 1.
- Tính chất tiền tố thể hiện ở việc các ký tự phải nằm ở nút lá.
- Mã Huffman của ký tự là đường dẫn từ nút gốc đến nút lá đó.
Mã hóa Huffman được coi là phương pháp nén tốt, sử dụng các ký hiệu
trong văn bản gốc để nén dữ liệu. Trong bất cứ văn bản nào đều có các ký tự
có số lần xuất hiện nhiều hơn so với các ký tự khác. Ví dụ như trong tiếng
Anh, các chữ cái A, E, N, H, T thường xuyên xuấ t hiện nhiều hơn các chữ cái
J, Q, X.

Xét các chữ cái có độ dài từ mã là 8-bits theo bảng mã ASCII.
Ý tưởng của thuật toán Huffman là xét các chữ cái có tần số xuất hiện
nhiều hơn sẽ có độ dài từ mã ngắn hơn, các chữ cái xuất hiện ít hơn sẽ có độ
dài từ mã dài hơn. Do đó tổng số bit của dữ liệu nén được sẽ giảm đáng kể so
với dữ liệu nguồn.
Mã Huffman là kỹ thuật nén dữ liệu dựa trên xác suất xuất hiện của các
ký hiệu trong khối dữ liệu. Các ký hiệu xuất hiện thường xuyên sẽ cần ít bít
để biểu diễn hơn so với các ký hiệu không thường xuyên xuất hiện. Để biểu
diễn được các bit nhị phân này, ông đề xuất cách tổ chức ký hiệu trên cây nhị
phân dựa vào tần suất xuất hiện các ký hiệu.
Số hóa bởi Trung tâm Học liệu – ĐHTN




7

Xét chuỗi ký hiệu “ABBAANDPANAMA” được trình bày cụ thể hơn
trong Bảng 1.2 mô tả về từ mã và độ dài từ mã tương ứng với mỗi ký hiệu
xuất hiện trong mỗi “ABBAANDPANAMA”.
Bảng 1.2. Mô tả các thông tin với mã Huffman
Ký hiệu
Số lần xuất hiện
Từ mã
Độ dài từ mã

A
6
1
1


B
2
011
3

N
2
000
3

D
1
0010
4

M
1
0011
4

P
1
010
3

Đối với ký hiệu 'A' xuất hiện nhiều nhất ta cần một bit để biểu diễn; đối
với các ký hiệu 'B', 'N', 'P' xuất hiện ít hơn ta cần 3 bit để biểu diễn, các ký
hiệu còn lại là 'D', 'M' xuất hiện 1 lần thì cần 4 bit để biểu diễn.
Ví dụ: Xét mô ̣t daỹ gồ m 6 biể u tượng: Xác suấ t xuấ t hiêṇ của 6 biểu

tươ ̣ng đươ ̣c cho như hình dưới đây:

Hình 1.3. Mã hóa Huffman
Từ hình trên ta có. Trước tiên, mã hóa Huffman tính tổng đồng thời hai
biểu tượng có xác suất nhỏ nhất thành một biểu tượng mới với một xác suất
mới (0,06+0,04=0,1), lặp lại quá trình đó cho đến khi chỉ còn một biểu tượng
và xác suất bằng 1.
Bước ngược lại để mã hóa mỗi xác xuất với mã nhị phân bắt đầu với
nguồn nhỏ nhất và làm trở lại nguồn ban đầu như hình.

Số hóa bởi Trung tâm Học liệu – ĐHTN




8

Hình 1.4. Mã hóa Huffman ngược
Vào năm 1952, D.Huffman đã phát minh ra một cách tổng quát để tìm
ra bảng mã này một cách tốt nhất.
- Bước đầu tiên trong việc xây dựng mã Huffman là đếm số lần xuất
hiện của mỗi kí tự trong tập tin sẽ được mã hóa.
- Bước tiếp theo là xây dựng một cây nhị phân với các tần số được chứa
trong các nút. Hai nút có tần số bé nhất được tìm thấy và một nút mới được
tạo ra với hai nút con là các nút đó với giá trị tần số của nút mới bằng tổng tần
suất của hai nút con.
Bước tiếp theo là xây dựng một cây nhị phân với các tần số được chứa
trong các nút. Hai nút có tần số bé nhất được tìm thấy và một nút mới được
tạo ra với hai nút con là các nút đó với giá trị tần số của nút mới bằng tổng tần
suất của hai nút con.

Tiếp theo hai nút mới với tần số nhỏ nhất lại được tìm thấy và một nút
mới nữa lại được tạo ra theo cách trên. Lặp lại như vậy cho đến khi tất cả các
nút được tổ hợp thành một cây duy nhất.
- Sau khi cây nhị phân, bảng mã Huffman được phát sinh bằng cách
thay thế các tần số ở nút đáy bằng các kí tự tương ứng.
Ưu điểm của phương pháp mã hóa Huffman là đạt được hệ số nén cao (
Hệ số nén tùy thuộc vào cấu trúc của các tập tin).
Nhược điểm của phương pháp này là bên nhận muốn giải mã được
Số hóa bởi Trung tâm Học liệu – ĐHTN




9

thông điệp thì phải có một bảng mã giống như bảng mã ở bên gửi, do đó khi
nén các tập tin bé hệ số nén không được cao.
1.3.3. Phương pháp nén LZW
Phương pháp nén LZW được xây dựng bởi Lempel - Zip và Welch.
Thuật toán này là phát triển thêm của thuật toán LZ78[1].
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 bit hay nhiều hơn 256 kí tự bổ sung mà mã 9 bits cung cấp
được dùng để lưu chữ các chuỗi mã được quyết định từ các chuỗi trong nguồn
tin.
Nguyên tắc hoạt động của nó như sau:

- Một xâu kí tự là một tập hợp từ hai kí tự trở lên.
- Nhớ tất cả các xâu kí tự đã gặp và gán cho nó một dấu hiệu (token)
riêng.
- Nếu lần sau gặp lại xâu kí tự đó, xâu kí tự sẽ được thay thế bằng dấu
hiệu của nó.
Thuật toán nén:
Bước 1: Thống kê tạo ra từ điển, ghi vào tệp nén, t:=false; Đọ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
Số hóa bởi Trung tâm Học liệu – ĐHTN




10

Else Begin
w:=ww +ch;
t:= false;
End;
TIMCHU(w,tl);
if tl=false then
Begin
Code(w,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, giải nén gán
vào w, t=false;
Bước 2: While not eof(f) do
Begin
Đọc file tiếp theo

b

Decode(b,s,t);
If t=true then
Begin
For i:=1 to length(s) do
Begin
Số hóa bởi Trung tâm Học liệu – ĐHTN




11

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;
End 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.
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. Đồng thời khắc phục được các điểm yếu
của thuật toán nén, góp phần làm thuật toán nén trở nên tốt hơn đối với người
sử dụng[1].
Phần quan trọng của phương pháp nén này là phải tạo ra một mảng rất
lớn dùng để lưu giữ các xâu kí tự đã gặp ( Mảng này được gọi là "Từ điển").
Khi các byte dữ liệu cần nén được đem đến, chúng liền được giữ lại trong một
bộ đệm chứa (Accumulator) và đem so sánh với các chuỗi đã có trong từ điển.
Nếu chuỗi dữ liệu trong bộ đệm chứa không có trong "Từ điển" thì nó được
Số hóa bởi Trung tâm Học liệu – ĐHTN





12

bổ sung vào "Từ điển" và chỉ số của chuỗi ở trong "Từ điển" chính là dấu hiệu
của chuỗi. Nếu chuỗi trong bộ đệm chứa đã có trong "Từ điển" thì dấu hiệu
của chuỗi được đem ra thay cho chuỗi ở dòng dữ liệu ra. Có bốn quy tắc để
thực hiện việc nén dữ liệu theo thuật toán LZW là[1]:
Quy tắc 1: 256 dấu hiệu đầu tiên được dành cho các kí tự đơn (0- 0ffh).
Quy tắc 2: Cố gắng so sánh với "Từ điển" khi trong bộ đệm chứa đã có
nhiều hơn hai kí tự.
Quy tắc 3: Các kí tự đầu vào (nhận từ tập tin sẽ được nén) được bổ
sung vào bộ đệm chứa đến khi chuỗi kí tự trong bộ đệm chứa không có trong
"Từ điển".
Quy tắc 4: Khi bộ đệm chứa có một chuỗi mà trong "Từ điển" không
có thì chuỗi trong bộ đệm chứa được đem vào "Từ điển". Kí tự cuối cùng của
chuỗi kí tự trong bộ đệm chứa phải ở lại trong bộ đệm chứa để tiếp tục tạo
thành chuỗi mới.
Ví dụ: Các bước để mã hóa chuỗi "!BAN!BA!BAA!BAR!" như sau
(Bảng 4.1):
- Bước 1: Kí tự thứ nhất "!" được cất vào bộ đệm chứa để chuẩn bị tạo
nên một chuỗi.
- Bước 2: Kí tự thứ hai "B" nối thêm vào kí tự "!". Vì trong "Từ điển"
chưa có chuỗi "!B" nên chuỗi này được thêm vào "Từ điển" và được gán
dấu hiệu là 100h ( Vì từ 000h đến 0ffh được dành riêng cho các kí tự đơn:
Quy tắc 1 ). "!" được gửi ra còn "B" phải ở lại trong bộ đệm chứa.

Số hóa bởi Trung tâm Học liệu – ĐHTN





13

Bước 3: Kí tự thứ ba "A" thêm vào sau "B". Chuỗi "BA" cũng chưa có
trong "Từ điển" nên nó được thêm vào "Từ điển" và gán dấu hiệu 101h. "A" ở
lại trong bộ đệm chứa còn "B" được gửi ra.
Bước 4: Kí tự thứ tư "N" thêm vào sau "A" tạo thành chuỗi "AN" cũng
chưa có trong "Từ điển" nên được thêm vào "Từ điển" và có dấu hiệu là 102h.
"N" ở lại trong bộ đệm chứa còn "A" được gửi ra.

Số hóa bởi Trung tâm Học liệu – ĐHTN




14

Bước 5: Kí tự thứ "!" thêm vào "N" để tạo thành chuỗi "N!", "N!" được
thêm vào "Từ điển" với dấu hiệu là 103h. "!" ở lại còn "N" được gửi ra.
Bước 6: Kí tự thứ "B" thêm vào sau "!". Lần này thì chuỗi "B!" đã có
trong "Từ điển" nên không có kí tự nào được gửi ra. "B!" tiếp tục ở lại trong
"Từ điển" để tạo ra chuỗi mới.
Bước 7: Kí tự thứ bảy "A" thêm vào sau "B" để tạo thành chuỗi "B!A",
do "B!A" không có trong "Từ điển" nên có được thêm vào "Từ điển" và gán
dấu hiệu là 104h đồng thời dấu hiệu 100h được gửi ra cho thay cho "B!" (Quy
tắc 4). A tiếp tục ở lại trong bộ đệm chứa để tạo thành chuỗi mới.
Các bước trên cứ thế tiếp tục cho đến khi hết tập tin cần nén. Việc giảm
kích thước chỉ thực sự bắt đầu tại bước 7 khi mà một dấu hiệu 12 bit là 100h
được gửi ra thay cho hai byte "B!".
Trong thuật toán nén này, phần lớn thời gian khi bắt đầu nén chủ yếu

mất vào việc tạo "Từ điển". Khi ""Từ điển" để so sánh. Vì dấu hiệu được biểu
diễn bằng số 12 bit nên "Từ điển" Từ điển" đủ lớn, xác suất gặp chuỗi ở bộ
đệm chứa trong "Từ điển" tăng lê và càng nén được nhiều hơn. Một điều cần
chú ý ở đây là một dấu hiệu, ta phải lưu một chuỗi trong sẽ có 4096 lối vài,
khi tăng số bit để biểu diễn dấu hiệu lên thì hiệu quả nén sẽ tốt hơn nhưng lại
bị giới hạn bởi bộ nhớ của máy tính. Ví dụ: Khi dùng 16 bits để biểu diễn một
dấu hiệu thì "Từ điển" phải có đến 65536 lối vào, nếu mỗi lối vào có khoảng
20 kí tự "Từ điển" phải lớn khoảng 1,2 MB. Với một từ điển có dung lượng
như vậy rất khó có thể thực hiện trên các máy tính PC hoạt động dưới hệ điều
hành DOS vì giới hạn đoạn (Segment) là 64 KB. Ưu điểm của phương pháp
nén LZW là bên nhận có thể tự xây dựng bảng mã mà không cần bên gửi phải
gửi kèm theo bản tin nén.
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. Đồng thời khắc phục được sự cứng nhắc
Số hóa bởi Trung tâm Học liệu – ĐHTN




15

của thuật toán nén, góp phần làm thuật toán nén trở nên mềm dẻo hơn, có sức
hấp dẫn hơn đối với người sử dụng.
1.3.4. Chọn phương pháp nén
Ta có thể thấy mỗi một phương pháp nén có các ưu nhược điểm riêng.
Thuật toán nén độ dài loạt (Runlength): không thể áp dụng cho nhiều loại
tập tin được như tập tin chương trình, tập tin cơ sở dữ liệu... Bởi vì các loạt
chạy là rất ngắn, do đó nếu áp dụng thuật toán này làm cho tập tin truyền đi
lớn hơn.
Thuật toán Huffman:

+ Ưu điểm: là hệ số nén tương đối cao, phương pháp thực hiện tương
đối đơn giản, đòi hỏi ít bộ nhớ, có thể xây dựng trên các bảng mã bé hơn 64
KB.
+ Nhược điểm: bên nhận phải chứa cả bảng mã vào tập tin nén thì bên
nhận mới có thể giải mã được do đó hiệu suất nén chỉ cao khi ta thực hiện nén
các tập tin lớn.
Thuật toán nén LZW:
+ Ưu điểm: hệ số nén tương đối cao, trong tập tin nén không cần phải
chứa bảng mã.
+ Nhược điểm: tốn nhiều bộ nhớ, khó có thể thực hiện dựa trên các
mảng đơn giản bé hơn 64KB
Các thuật toán nén kể trên thường được áp dụng để nén các tập tin lưu
trữ trên máy tính hoặc trước khi truyền qua trên mạng. Khi tập tin cần truyền
trên mạng chỉ là một bản vá cho các tệp thực thi mà phiên bản cũ của chúng
đã tồn tại trên máy đích, việc áp dụng các thuật toán trên sẽ không thực sự
hiệu quả. Một công nghệ nén khác được tập đoàn Microsoft phát triển nhằm

Số hóa bởi Trung tâm Học liệu – ĐHTN




×