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

(Luận văn thạc sĩ) các kỹ thuật kiểm thử đột biến và ứng dụng kiểm thử chương trình c

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 (2.33 MB, 63 trang )

ĐẠI HỌC QUỐC GIA HÀ NỘI

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

Vũ Văn Minh

ĐỀ TÀI
ỨNG DỤNG PHƯƠNG PHÁP
MOVE-TO-FRONT TRONG NÉN DỮ LIỆU
Chun ngành: Bảo đảm tốn học cho máy tính
và hệ thống tính tốn
Mã số: 60.46.35

LUẬN VĂN THẠC SĨ KHOA HỌC

NGƯỜI HƯỚNG DẪN KHOA HỌC
GS.TSKH. Nguyễn Xuân Huy

Hà Nội, năm 2011


Ứng dụng phương pháp Move to front trong nén dữ liệu

DANH MỤC HÌNH VẼ, BẢNG BIỂU ...........................................................6
DANH MỤC CÁC TỪ VIẾT TẮT .................................................................7
Mở đầu .............................................................................................................8
Chương 1. TỔNG QUAN VỀ NÉN DỮ LIỆU ...............................................9
1.1 Thơng tin, dữ liệu và mã hóa .................................................................. 9
1.2 Dữ liệu ký hiệu ...................................................................................... 10
1.3 Sự thay đổi độ dài mã ........................................................................... 11
1.3.1 Tính duy nhất để giải mã .............................................................11


1.3.2 Mã tiền tố và cây nhị phân ...........................................................12
1.4 Cơ bản về lý thuyết thông tin ................................................................ 13
1.4.1 Entropy .........................................................................................13
1.4.2 Mã tối ưu ......................................................................................15
1.5 Sự dư thừa dữ liệu ................................................................................. 15
1.6 Nén dữ liệu ............................................................................................ 16
1.6.1 Nén và giải nén dữ liệu ................................................................16
1.6.2 Nén có mất thơng tin và nén không mất thông tin .......................17
1.6.3 Nén theo khối dữ liệu ...................................................................18
1.7 Mã hóa Entropy ..................................................................................... 18
1.7.1 Mã hóa Huffman ..........................................................................19
1.7.2 Mã hóa số học ..............................................................................19
Chương 2. NÉN DỮ LIỆU VÀ PHƯƠNG PHÁP MOVE-TO-FRONT ......20
2.1 Thuật tốn mã hóa độ dài (RLE) ........................................................... 20
2.1.1 Giới thiệu RLE .............................................................................20

3


Ứng dụng phương pháp Move to front trong nén dữ liệu

2.1.2 Mã hóa..........................................................................................21
2.1.3 Giải mã .........................................................................................23
2.2 Thuật tốn mã hóa Huffman ................................................................. 24
2.2.1 Giới thiệu thuật tốn mã hóa Huffman ........................................24
2.2.2 Mã hóa Huffman .........................................................................28
2.2.3 Giải mã Huffman .........................................................................29
2.3 Thuật toán nén số học ............................................................................ 31
2.3.1 Giới thiệu nén số học ....................................................................31
2.3.2 Mơ hình nén số học ......................................................................32

2.3.3 Trường hợp tổng quát trong nén số học .......................................35
2.3.4. Ví dụ về nén số học ......................................................................37
2.4 Phép biến đổi Burrows-Wheeler (BWT) .............................................. 39
2.4.1 Giới thiệu BWT............................................................................39
2.4.2 Mã hóa..........................................................................................39
2.4.3 Giải mã .........................................................................................42
2.5 Phép biến đổi Move-To-Front (MTF) ................................................... 45
2.5.1 Giới thiệu MTF ............................................................................45
2.5.2 Mã hóa..........................................................................................45
2.5.3 Giải mã .........................................................................................47
2.6. Phân tích phương pháp MTF ................................................................ 48
2.6.1. Tổ chức dữ liệu ............................................................................48
2.6.2. Thực hiện .....................................................................................49
2.7 Lược đồ nén dữ liệu ứng dụng phương pháp MTF ............................... 49
2.7.1 Lược đồ nén dữ liệu ....................................................................49

4


Ứng dụng phương pháp Move to front trong nén dữ liệu

2.7.2 Nén dữ liệu ...................................................................................50
2.8 Một số cải tiến phương pháp MTF ....................................................... 51
2.8.1 Một số định nghĩa ........................................................................51
2.8.2 Cơ sở MTF ....................................................................................52
2.8.3 Một số cải tiến MTF......................................................................53
Chương 3. KẾT QUẢ THỰC NGHIỆM .......................................................55
3.1. Môi trường thực nghiệm ....................................................................... 55
3.2 Dữ liệu mẫu ........................................................................................... 55
3.3 Phân tích thực nghiệm kết quả ............................................................. 56

3.3.1 Áp dụng MTF với thuật toán nén Huffman ..................................56
3.3.1 Áp dụng MTF với thuật toán nén số học .....................................58
3.4. Kết luận ................................................................................................. 59
PHỤ LỤC .......................................................................................................62

5


Ứng dụng phương pháp Move to front trong nén dữ liệu

DANH MỤC HÌNH VẼ, BẢNG BIỂU
Hình 1. Cây nhị phân trong mã Huffman .....................................................12
Hình 2. Mã tiền tố .........................................................................................13
Hình 3. Nén dữ liệu khơng mất thơng tin ......................................................17
Hình 4. Nén dữ liệu có mất thơng tin ............................................................18
Hình 5. Phương pháp nén RLE (1) ...............................................................20
Hình 6. Phương pháp nén RLE (2) ...............................................................21
Hình 7. Minh họa nén theo phương pháp Huffman ......................................27
Hình 8. Cây Huffman trong nén dữ liệu.......................................................27
Hình 9. Mã hóa Arithmetic với hai ký hiệu ...................................................31
Hình 10. Minh họa phân đoạn với khối dữ liệu “IOU” ...............................34
Hình 11. Minh họa cách giải mã Burrows - Wheeler ...................................42
Hình 12. Minh họa cách giải mã ví dụ..........................................................43
Hình 13. Lược đồ nén dữ liệu của Burrows-Wheeler ...................................49
Hình 14. Thể hiện các bước nén khối dữ liệu. ..............................................51
Hình 15. Mơi trường lập trình Dev C++ ......................................................55
Bảng 1. Mô tả các thông tin với mã Huffman ...............................................19
Bảng 2. Mô tả các trường hợp xuất hiện các ký hiệu khi nén ......................21
Bảng 3. Bảng mã nhị phân mở rộng với hai ký hiệu ....................................32
Bảng 4. Bảng xác suất và phân đoạn của các ký hiệu ..................................37

Bảng 5. Mã hóa theo phương pháp số học ...................................................38
Bảng 6. Giải mã theo phương pháp số học...................................................38
Bảng 7. Mô tả q trình mã hóa MTF ..........................................................46
Bảng 8. Mơ tả q trình giải mã MTF ..........................................................47
Bảng 9. Các tệp tin mẫu để thực nghiệm ......................................................56
Bảng 10. Kết quả thực nghiệm ......................................................................57
Bảng 11. So sánh các phương pháp nén MTF0, MTF1, MTF2 ....................58
Bảng 12. Số lần xuất hiện các ký hiệu trong tệp tin paper1 ban đầu ...........63
Bảng 13. Số lần xuất hiện các ký hiệu sau khi sử dụng MTF .......................64

6


Ứng dụng phương pháp Move to front trong nén dữ liệu

DANH MỤC CÁC TỪ VIẾT TẮT
Từ viết tắt

Viết đầy đủ

1

ASCII

American Standard Code for Information Interchange

2

BIT


BInary digiT

3

BMRH

BWT- MTF- RLE- Huffman

4

BRH

BWT - RLE- Huffman

5

BWCA

Burrow-Wheeler Compression Alogrithm

6

BWT

Burrow-Wheeler Transform

7

EC


Entropy Coding

8

GIF

Graphics Interchange Format

9

JPEG

Joint Photographic Experts Group

10

MPEG

Moving Picture Experts Group

11

MTF

Move-To-Front

12

RLE


Run Length Encoding

TT

7


Ứng dụng phương pháp Move to front trong nén dữ liệu

Mở đầu
Nén dữ liệu được sử dụng rất rộng rãi, trong mọi lĩnh vực của cơng nghệ
thơng tin. Những hình ảnh mà chúng ta thấy trên trang Web là những hình ảnh đã
được nén như JPG, GIF hoặc những bộ phim có định dạng MPEG cũng được nén
để đảm bảo sử dụng ít dung lượng hơn khi xem trực tuyến hoặc tải về từ internet,
một số tệp tin hệ thống máy tính cũng tự động được nén khi lưu trữ. Vậy nén dữ
liệu là gì? Có rất nhiều phần mềm nén dữ liệu được công bố như zip, gzip hoặc
winzip (và nhiều hơn nữa) để giảm bớt dung lượng trước khi lưu trữ hoặc truyền đi.
Mục đích của luận văn này là nghiên cứu phương pháp Move-To-Front
(MTF) trong nén dữ liệu. MTF là một kỹ thuật biến đổi mã ký hiệu, thường được
dùng như là bước thứ hai trong thuật toán nén dữ liệu Burrow-Wheeler compression
algorithm [10]. Bước đầu tiên trong thuật toán nén dữ liệu BWCA là phép biến đổi
Burrow-Wheeler transform [9] được giới thiệu lần đầu tiên vào năm 1994 bởi hai
tác giả là Burrow và Wheeler, BWT biến đổi vị trí các ký hiệu sao cho các ký hiệu
giống nhau sẽ đứng cạnh nhau, bước tiếp theo của thuật toán này là phương pháp
MTF, phương pháp này xử lý dữ liệu đầu ra của phương pháp BWT để được dữ liệu
có khả năng nén cao hơn với mã nén Entropy (một cách khác của thuật tốn BWCA
có thêm bước mã nén theo độ dài – Run-Length Encoding (RLE)). Ngày nay,
phương pháp BWT kết hợp MTF được ứng dụng để nén với nhiều loại dữ liệu khác
nhau như văn bản, hình ảnh, âm thanh hoặc phim. Luận văn này tập trung nghiên
cứu phương pháp MTF và một số cải tiến của phương pháp này trong nén văn bản

để đạt được hiệu quả cao hơn.

8


Ứng dụng phương pháp Move to front trong nén dữ liệu

Chương 1. TỔNG QUAN VỀ NÉN DỮ LIỆU
1.1 Thông tin, dữ liệu và mã hóa
Thơng tin là một thể hiện về kiến thức và tư duy của con người hiểu biết về
các trạng thái của hệ thống – đó là các thông tin không chắc chắn. Con người cảm
nhận được sự tồn tại của thông tin, nhận biết được sự đa dạng các phương tiện mang
thông tin và bất cứ lúc nào cũng nhận thấy sự tác động ngược trở lại của thơng tin
đối với con người – đó là các thông tin chắc chắn.
Thông tin không hiện hữu như các thiết bị vật lý, nó tồn tại như một dữ liệu
logic được chứa trong các phương tiện vật lý như đĩa CD hay các kênh truyền thơng
tin. Vì thế dữ liệu được xem như dạng cơ bản của một số thông tin thực. Điều này
tạo nên sự khác biệt giữa các thông tin với nhau như văn bản, đồ họa, âm thanh,
hình ảnh… Một lượng lớn thơng tin cần phải được tổ chức, lưu trữ dưới dạng các
tệp tin hoặc các thơng điệp.
Ví dụ với dữ liệu “-300C” mang thông tin thực là “Trời rất lạnh” hoặc một
mẩu tin trên có thể được suy diễn từ đoạn văn bản là “âm ba mươi độ C”. mẩu tin
này được thể hiện trên các trang báo, trên truyền hình hoặc một cơng cụ đo nhiệt độ
nào đó. Nếu khơng có các phương tiện này thì thơng tin khơng được thể hiện.
Thuật ngữ dữ liệu trong nén dữ liệu là một dạng số hóa của thơng tin thực
được xử lý bởi một chương trình máy tính nào đó. Dữ liệu trước khi được nén gọi là
dữ liệu nguồn.
Một số ví dụ về thông tin thực được phân loại rộng rãi là văn bản, âm thanh,
hình ảnh và phim. Nhiều chương trình ứng dụng nhận kiểu thông tin là kiểu tệp tin
phù hợp với cách xử lý của chúng. Do đó dữ liệu cũng có thể được phân loại dưới

dạng văn bản, hình ảnh, âm thanh và phim trong khi các chương trình xử lý số hóa
dữ liệu coi thơng tin là các chuỗi BIT 0 và 1 định dạng nhị phân.

9


Ứng dụng phương pháp Move to front trong nén dữ liệu

Văn bản: dữ liệu thường được thể hiện dưới dạng 8 BIT mã ASCII. Chúng
xuất hiện trong các tệp tin có phần mở rộng là .txt hoặc .doc được sử dụng trong các
phần mềm soạn thảo.
Nhị phân: dạng dữ liệu thường xuất hiện trong các tệp tin dữ liệu, tệp tin thi
hành hoặc mã chương trình. Các tệp tin này thường có phần mở rộng là .bin
Hình ảnh: dữ liệu thường được thể hiện như một mảng hai chiều các điểm
ảnh, mỗi điểm ảnh là một mã màu xác định nào đó. Phần mở rộng của tệp tin này là
.bmp của chương trình xử lý ảnh bitmap của Windows hoặc .psd của chương trình
xử lý ảnh Photoshop.
Đồ họa: dữ liệu là các dạng vector hoặc phương trình tốn học. Ví dụ về dữ
liệu dạng này là .png là dạng chuẩn của Portable Network Graphics.
Âm thanh: dữ liệu được thể hiện dưới dạng sóng âm. Định dạng tệp tin âm
thanh là .wav
Mã hóa là q trình xử lý các chuỗi ký tự (chữ cái, chữ số, ký hiệu …) thành
một dạng đặc biệt nào đó để tốt hơn khi truyền hoặc khi lưu trữ. Mã hóa sử dụng
hầu hết trong máy tính cho các tệp tin văn bản là mã hóa ASCII, mỗi ký tự mã hóa
ở dạng này biểu diễn bằng 8 BIT nhị phân 0 và 1.
1.2 Dữ liệu ký hiệu
Các ký hiệu hoặc ký tự sử dụng ở đầu vào của thuật toán nén dữ liệu là cách
thể hiện phù hợp cho thuật toán nén mà trong đề tài đề cập đến. Văn bản, hình ảnh,
âm thanh hay phim được xem xét như một khối dữ liệu bao gồm mảng một chiều
các ký tự được xét đến trong thuật toán.

Khối dữ liệu nguồn S=(s1, s2, s3, …. , sn) được coi là một chuỗi các ký tự s1,
s2, s3, …. , sn. Thể hiện dưới dạng số hóa của tập các ký tự trong S là C=(c1, c2, c3,
…, cn), với mỗi ci được gọi là một từ mã đại diện cho ký tự si (i=1,2,3,..,n). Việc
biến đổi các ký tự si để được ci gọi là quá trình mã hóa, ngược lại biến đổi từ ci

10


Ứng dụng phương pháp Move to front trong nén dữ liệu

thành si gọi là giải mã. Sự thể hiện cơ bản của ký hiệu là mã ASCII có độ dài 8-bit.
Số bit của từ mã được gọi là độ dài mã.
1.3 Sự thay đổi độ dài mã
Đối với các ký tự thơng thường trong bảng mã ASCII mã hóa 256 ký tự khác
nhau, mỗi ký tự có độ dài mã là 8-bit. Để biểu diễn chuỗi ký tự S=“banana” theo
cách thông thường ta cần 48-bit. Nhưng trong nén dữ liệu ta có thể loại bỏ đi các ký
hiệu khơng có trong dữ liệu nguồn, mà ta chỉ mô tả các ký hiệu xuất hiện trong dữ
liệu nguồn mà thôi. Như vậy, với chuỗi ký tự S ta có thể lưu ở bảng ký hiệu mới với
mã tương ứng cho từng ký hiệu là là a=00, b=01, n=10. Vậy để biểu diễn chuỗi ký
tự S lúc này ta chỉ cần 12-bit. Tuy nhiên cịn có những cách khác ta có thể giảm bớt
số bit của các ký tự bằng cách thay đổi độ dài từ mã mà vẫn đảm bảo được dữ liệu
chính xác.
1.3.1 Tính duy nhất để giải mã
Thay đổi độ dài từ mã là rất tốt cho việc nén dữ liệu. Tuy nhiên thay đổi độ
dài từ mã sẽ là vơ ích nếu như khơng xác định tính duy nhất các từ mã trong thơng
điệp cần mã hóa. Nghĩa là các ký hiệu phải có từ mã duy nhất.
Xét các từ mã (0, 10, 010, 101) tương ứng với các ký tự (a, b, c, d). Một đoạn
mã hóa thông điệp là “0100101010” sẽ được giải mã với nhiều kết quả khác nhau
như “0 10 010 101 0” là abcda hoặc “010 0 101 010” là cadc.
Một mã có tính duy nhất để giải mã nếu chỉ có một cách duy nhất để giải mã

thơng điệp đã mã hóa. Tất nhiên cũng có những cách khác để làm việc này, ví dụ
như thêm dấu “/” để phân cách các từ mã “0/10/010/101/0”, nhưng điều này sẽ phản
tác dụng khi ta nén dữ liệu, làm tăng dung lượng dữ liệu nén và khó khăn trong thao
tác nén và giải nén. Tuy nhiên điều này cho ta ý tưởng tự phân cách các ký tự trong
thông điệp giải mã bằng cách tổ chức dưới dạng cây nhị phân.
Tính chất tự phân cách được thể hiện rõ khi ta biểu diễn dưới dạng cây nhị
phân trong Hình 1. Mỗi nhánh con bên trái được ký hiệu là 0 và nhánh con bên phải

11


Ứng dụng phương pháp Move to front trong nén dữ liệu

được ký hiệu là 1. Trong suốt quá trình giải mã, mỗi từ mã thu được bằng cách đọc
lần lượt các bit 0 hoặc 1 từ nút gốc đến nút lá, đọc tới nút lá ta coi như hết từ mã và
giá trị của nút là chính là ký hiệu cần giải mã.

Hình 1. Cây nhị phân trong mã Huffman

1.3.2 Mã tiền tố và cây nhị phân
Tiền tố là số các bit liên tiếp đứng trước từ mã. Khi có hai từ mã có độ dài
mã khác nhau, có thể từ mã ngắn lại chính là phần đứng trước của từ mã dài. Trong
trường hợp này từ mã ngắn được gọi là tiền tố của từ mã dài.
Ví dụ xét từ mã c1 = 010 (độ dài mã là 3) và c2 = 01011 (độ dài mã là 5). Khi
đó từ mã ngắn c1 chính là tiền tố của từ mã dài c2. Từ mã c2 có thể được suy ra từ từ
mã c1 bằng cách bổ sung thêm hai bit 11 vào từ mã c1.
Xét các từ mã “0, 10, 110, 111” thì khơng có từ mã ci (i=0,1,2,3) là tiền tố
của từ mã cj (j=0,1,2,3). Trong khi đó các từ mã “0, 10, 010, 101” thì c0= “0” là
tiền tố của từ mã c2= “010”, như vậy sẽ tồn tại hai từ mã có cùng mã “10”
Tính chất tiền tố trở thành một đặc tính tốt khi tìm kiếm mã có khả năng giải

mã. Mã có tính chất tiền tố được gọi là mã tiền tố. Nói cách khác, khơng tồn tại một
từ mã mà nó có thể suy ra từ một từ mã khác ngắn hơn.
Để kiểm tra bất cứ một mã nhị phân nào có phải là mã tiền tố hay không
bằng cách vẽ cây nhị phân. Trong đó với mỗi một từ mã là đường đi từ nút gốc đến
nút lá, bit 0 trong từ mã tương ứng với nút con trái của cây nhị phân, bit 1 trong từ

12


Ứng dụng phương pháp Move to front trong nén dữ liệu

mã tương ứng với nút con phải của cây nhị phân (Hình 2). Nếu trên đường đi tới các
nút lá là các từ mã thì đó là mã tiền tố.

Hình 2. Mã tiền tố

1.4 Cơ bản về lý thuyết thông tin
Lý thuyết thông tin là một ngành khoa học nghiên cứu về thông tin nhằm tạo
ra cơ sở hạ tầng tốt cho việc truyền thơng chính xác, nhanh chóng và an tồn; lưu
trữ có hiệu quả. Các lĩnh vực nghiên cứu của lý thuyết thông tin là truyền thông,
nén dữ liệu và bảo mật thông tin. Điểm quan trọng trong lĩnh vực lý thuyết thông tin
là entropy được C.E.Shannon giới thiệu vào năm 1948 [4].
1.4.1 Entropy
Trong lý thuyết thông tin, Entropy mơ tả mức độ hỗn loạn trong một tín hiệu
lấy từ một sự kiện ngẫu nhiên. Nói cách khác, entropy cũng chỉ ra có bao nhiêu
thơng tin trong tín hiệu, với thông tin là các phần không hỗn loạn ngẫu nhiên của tín
hiệu.
Ví dụ, nhìn vào một dịng chữ tiếng Việt, được mã hóa bởi các chữ cái,
khoảng cách, và dấu câu, tổng quát là các ký tự. Dòng chữ có ý nghĩa sẽ khơng hiện
ra một cách hồn tồn hỗn loạn ngẫu nhiên; ví dụ như tần số xuất hiện của chữ cái x

sẽ không giống với tần số xuất hiện của chữ cái phổ biến hơn là t. Đồng thời, nếu

13


Ứng dụng phương pháp Move to front trong nén dữ liệu

dòng chữ vẫn đang được viết hay đang được truyền tải, khó có thể đốn trước được
ký tự tiếp theo sẽ là gì, do đó nó có mức độ ngẫu nhiên nhất định. Entropy thông tin
là một thang đo mức độ ngẫu nhiên này.
Claude E. Shannon đã xây dựng định nghĩa về entropy để thoả mãn các giả
định sau:
• Entropy phải tỷ lệ thuận liên tục với các xác suất xuất hiện của các phần tử
ngẫu nhiên trong tín hiệu. Thay đổi nhỏ trong xác suất phải dẫn đến thay đổi nhỏ
trong entropy.
• Nếu các phần tử ngẫu nhiên đều có xác suất xuất hiện bằng nhau, việc tăng
số lượng phần tử ngẫu nhiên phải làm tăng entropy.
• Có thể tạo các chuỗi tín hiệu theo nhiều bước, và entropy tổng cộng phải
bằng tổng có trọng số của entropy của từng bước.
Shannon cũng chỉ ra rằng bất cứ định nghĩa nào của entropy, cho một tín
hiệu có thể nhận các giá trị rời rạc, thoả mãn các giả định của ơng thì đều có dạng:

Trong đó:
• K là một hằng số, chỉ phụ thuộc vào đơn vị đo.
• n là tổng số các giá trị có thể nhận của tín hiệu.
• i là giá trị rời rạc thứ i.
• p(i) là xác suất xuất hiện của giá trị i.

14



Ứng dụng phương pháp Move to front trong nén dữ liệu

1.4.2 Mã tối ưu
Với một mã tiền tố, ta biết độ dài của mỗi từ mã là L=(l1, l2, …, ln). Nếu
chúng ta biết xác suất xuất hiện của các từ mã là P = (p1, p2, …, pn) thì ta có thể tính
độ dài trung bình của từ mã là

và entropy được tính là H(P) =

.
Vì entropy cung cấp một giới hạn lý thuyết của số tối thiểu các bit thơng tin.
Sự khác nhau giữa độ dài trung bình của một mã và entropy tương ứng với lượng
dư thừa trong từ mã.
Tính tỉ lệ phân trăm của entropy của dữ liệu nguồn với độ dài từ mã trung
bình:

Lý thuyết thông tin khẳng định rằng một lược đồ nén dữ liệu khơng mất mát
thơng tin mã hóa nguồn dữ liệu với số lượng bit trung bình lớn hơn hoặc bằng
entropy của dữ liệu nguồn tức là E(P, L) nhỏ hơn hoặc bằng 100%. Khi khoảng
cách giữa entropy và độ dài trung bình mã lớn hơn thì giá trị E(P, L) nhỏ hơn.
Một mã được gọi là tối ưu nếu hiệu quả mã đạt 100%, nói cách khác một mã
gọi là mã tối ưu nếu độ dài trung bình các từ mã bằng entropy của dữ liệu nguồn.
1.5 Sự dư thừa dữ liệu
Công việc đầu tiên của nén dữ liệu là tìm ra sự dư thừa trong dữ liệu nguồn.
Thuật ngữ dư thừa là có nghĩa chung, có thể là một số thông tin lồng nhau, các dữ
liệu cơ sở chung, các định danh riêng biệt được lưu trữ ở bộ nhớ ngồi. Ta xem xét
cụ thể qua các ví dụ sau.
Ví dụ 1: Một chuỗi ký tự lặp lại liên tiếp nhau là “BAAAAAAAC”. Sự dư
thừa ở đây là 7 ký tự A có thể thay thế bằng chuỗi ngắn hơn như r7A


15


Ứng dụng phương pháp Move to front trong nén dữ liệu

Ví dụ 2: Một chuỗi ký tự khơng lặp lại liên tiếp “ABACAA” nhưng ta lại
thấy ký tự “A” là tiền tố của các từ khác. Có những ký tự xuất hiện thường xuyên
hơn các ký tự khác, nếu ta mã hóa ký tự này với từ mã ngắn, các ký tự khác ít xuất
hiện hơn được mã hóa với từ mã dài, điều này sẽ cho ta một chuỗi ký tự mã hóa
ngắn hơn.

1.6 Nén dữ liệu
Việc tìm ra thuật toán nén dữ liệu hiệu quả để loại bỏ đi các thông tin dư
thừa trong dữ liệu được giải quyết như thế nào? Giải pháp nén các ký hiệu sẽ cho ta
thuật tốn nén dữ liệu mà có khả năng chứa ít BIT hơn dữ liệu ban đầu, cùng với
thuật tốn giải nén để khơi phục được chuỗi ký tự gốc.
Vấn đề là cần bao nhiêu BIT? Điều này phụ thuộc vào thuật toán và sự dư
thừa dữ liệu để suy ra dữ liệu gốc. Các dữ liệu khác nhau đòi hỏi các kỹ thuật khác
nhau để xác định sự dư thừa và loại bỏ dư thừa dữ liệu. Rõ ràng điều này làm cho
việc nén dữ liệu trở nên khó khăn hơn khi tìm ra một thuật tốn nén chung.
Khơng có thuật tốn nào hồn hảo để giải quyết các vấn đề về nén dữ liệu.
Trong các nghiên cứu về nén dữ liệu, về bản chất chúng ta cần phân tích các đặc
tính của dữ liệu cần nén và tìm ra được các mẫu đại diện phù hợp nhất thay thế cho
các dữ liệu này. Điều này làm phong phú thêm cho các mơ hình và kỹ thuật nén dữ
liệu đã được đưa ra.
1.6.1 Nén và giải nén dữ liệu
Nén dữ liệu được xem như cách thể hiện hiệu quả cho nguồn dữ liệu như văn
bản, hình ảnh, âm thanh hay phim. Mục đích của nén dữ liệu là để thể hiện dữ liệu
dạng số với lượng nhỏ các BIT hơn dữ liệu ban đầu.

Giải nén dữ liệu là quá trình ngược lại của nén dữ liệu, mỗi thuật tốn giải
nén phụ thuộc vào q trình nén.

16


Ứng dụng phương pháp Move to front trong nén dữ liệu

Trong phạm vi luận văn này tác giả trình bày thuật toán nén và giải nén dữ
liệu dựa vào phương pháp biến đổi Burrow-Wheeler và Move-To-Front kết hợp với
các thuật tốn mã hóa Huffman và Run-Length. Đây là phương pháp nén khơng mất
thơng tin.
1.6.2 Nén có mất thơng tin và nén khơng mất thơng tin
Có rất nhiều phương pháp nén và giải nén dữ liệu, nhưng thường được phân
lại thành hai nhóm chủ yếu là nén dữ liệu có mất thông tin và nén dữ liệu không mất
thông tin.
Nén dữ liệu không mất thông tin là phương pháp nén dữ liệu mà khi khơi
phục dữ liệu ban đầu thì thơng tin khơng bị mất, tức là khơng có thơng tin nào bị
mất trong quá trình nén. Hình 3 minh họa nén dữ liệu khơng mất thơng tin.

ABAAB

Nén dữ liệu

1000110110111

Giải nén
Hình 3. Nén dữ liệu không mất thông tin

Kỹ thuật nén dữ liệu không mất thông tin được sử dụng khi dữ liệu gốc là

quan trọng và không thể bỏ đi một chi tiết nào về dữ liệu. Ví dụ như các hình ảnh
chẩn đốn bệnh trong y học, các tệp tin thi hành trong máy tính, các văn bản và hình
ảnh vì lý do pháp luật nào đó.
Nén dữ liệu có mất thơng tin là phương pháp nén mà khơng lấy lại được dữ
liệu nguyên bản khi giải nén. Một số chi tiết không quan trọng sẽ bị mất khi thực
hiện nén, các chi tiết không quan trọng khi bỏ đi không làm giảm đáng kể chất
lượng của dữ liệu nguồn. Hình 4 nén dữ liệu sẽ bỏ đi các số phần lẻ không cần thiết
để được một số ngắn hơn.

17


Ứng dụng phương pháp Move to front trong nén dữ liệu

3.1415926

Nén dữ liệu

0001100111101

Giải nén

0001100111101
3.14

Hình 4. Nén dữ liệu có mất thơng tin

Nén dữ liệu có mất thơng tin được áp dụng cho những dữ liệu mà khi quan
sát hoặc các dữ liệu tính tốn phức tạp, sẽ loại bỏ đi các thơng tin ít quan trọng hơn,
khơng cần độ chính xác cao. Các dữ liệu đa phương tiện như hình ảnh, âm thanh,

phim thường được áp dụng kỹ thuật nén có mất thơng tin bởi vì liên quan đến tổ
chức và cách xử lý của mắt và tai người.
Một ứng dụng quan trọng nữa là trong truyền thông phụ thuộc vào hạ tầng
như băng thông, tốc độ truyền…, các thông tin truyền đi cần phải ít dung lượng, đặc
biệt là dữ liệu đa phương tiện chiếm rất nhiều không gian nhớ và chứa nhiều thông
tin dư thừa không cần thiết.
1.6.3 Nén theo khối dữ liệu
Trong nhiều nguồn dữ liệu cần nén có kích thước rất lớn, để làm việc với dữ
liệu này có hiệu quả tác giả chia dữ liệu nguồn ra thành các khối dữ liệu. Trong mỗi
bước của thuật toán xử lý một khối dữ liệu. Các khối có n ký hiệu, trong mỗi khối
các ký hiệu có thể khác nhau về số lượng cũng như tần suất xuất hiện mỗi ký hiệu.
Điều này ít nhiều làm ảnh hưởng tới chất lượng nén dữ liệu, tuy nhiên hiệu quả của
việc chia ra thành các khối để xử lý mang lại tốc độ nhanh hơn nhiều.
1.7 Mã hóa Entropy
Mục đích của mã entropy là nén dữ liệu khơng làm mất thông tin, mã nén
này cũng được dùng rất nhiều trong việc truyền thông tin. Mã Huffman và mã số
học là hai phương pháp mã entropy được sử dụng rộng rãi nhất hiện nay.

18


Ứng dụng phương pháp Move to front trong nén dữ liệu

1.7.1 Mã hóa Huffman
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 bit để 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. Xét chuỗi ký hiệu “BURROW WHEELER” được nói
chi tiết hơn trong phần 2.2.2 của luận văn này; Bảng sau đây 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 chuỗi “BURROW
WHEELER”
Ký hiệu

B

U

L

O

H

W

E

R

Số lần xuất hiện

1

1

1

1


1

2

3

3

Từ mã
Độ dài từ mã

1100 1101 0010 0011 000 111 01 10
4

4

4

4

3

3

2

2

Bảng 1. Mô tả các thông tin với mã Huffman


Đối với ký hiệu “R” hoặc “E” xuất hiện nhiều nhất thì cần 2-bit để biểu diễn;
đối với các ký hiệu “B”, “U”, “L”, “O” xuất hiện một lần thì cần 4-bit để biểu diễn.
1.7.2 Mã hóa số học
Nén số học là một dạng biến đổi từ mã bằng phương pháp entropy được sử
dụng trong nén dữ liệu không mất mát thông tin. Thông thường một chuỗi các ký tự
được biểu diễn với một số lượng bit nhất định cho mỗi ký tự, ví dụ như 8-bit đối với
các ký tự mã ASCII. Khi chuỗi ký tự đó được chuyển đổi sang dưới dạng mã số
học, các ký tự thường xuyên xuất hiện sẽ được lưu với số bit ít hơn so với các ký
hiệu không xuất hiện thường xuyên. Mã số học mã hóa tồn bộ thơng điệp thành số
thực n (single number) (0.0 ≤ n < 1.0).

19


Ứng dụng phương pháp Move to front trong nén dữ liệu

Chương 2. NÉN DỮ LIỆU VÀ PHƯƠNG PHÁP MOVE-TO-FRONT
Trong chương này tác giả trình bày các phương pháp nén dữ liệu được sử
dụng trong lược đồ nén mà tác giả chọn. Trong đó có ba thuật tốn nén dữ liệu là
thuật toán Run Length Encoding, thuật toán Huffman và thuật toán nén số học; hai
phương pháp biến đổi dữ liệu đầu vào là phép biến đổi Burrow-Wheeler và Move to
front.
2.1 Thuật tốn mã hóa độ dài (RLE)
2.1.1 Giới thiệu RLE
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. Vì vậy thuật toán RLE được sử dụng ngay sau phương pháp BWT. Bởi
vì phương pháp BWT tạo ra rất nhiều các ký hiệu lặp lại liên tiếp.
Ý tưởng chính của phương pháp RLE rất đơn giản, nếu có ‘aaaaaaa’ thì ta
kết xuất ra ‘aa’ và số lần xuất hiện ký hiệu này.

RLE

a

a 6

Hình 5. 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. 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:

20


Ứng dụng phương pháp Move to front trong nén dữ liệu

a

RLE

a 255

a


4

Hình 6. 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 nén
chúng. Sau đây là 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:
Dữ liệu nguồn

Dữ liệu nén

aaaaaa

aa4

aa

aa0

bc

bc

Bảng 2. Mô tả các trường hợp xuất hiện các ký hiệu khi nén

2.1.2 Mã hóa
Thuật tốn mã hóa RLE
Đọc 2 byte
Bước lặp

Hai byte đó như nhau?
Nếu đúng
o

Kết xuất hai byte đó vào tệp đích

o

Đếm số lần lặp còn lại (sau hai byte đầu)

o

Kết xuất giá trị lặp

o

Cập nhật con trỏ tới file nguồn

o

Đọc hai byte tiếp theo.

o

Quay lại bước lặp

Nếu không đúng
o

Kết xuất byte đầu tiên


o

Đặt byte thứ hai như là byte đầu tiên

o

Đọc byte tiếp theo như là byte thứ hai

21


Ứng dụng phương pháp Move to front trong nén dữ liệu

o

Cập nhật con trỏ tới file nguồn

o

Quay lại bước lặp.

Các ký hiệu sử dụng trong thuật toán:
in: tệp nguồn
out: tệp đích
c: ký hiệu đọc được từ tệp nguồn
prev: ký hiệu đứng trước ký hiệu c
rle_cnt: số lần lặp
Đoạn mã nguồn như sau:
if ((c=getc(in)) != EOF) {

putc((unsigned char) c, out);
prev = c;
}
else return;
while ((c=getc(in)) != EOF) {
if (c != prev) {
/* if there's a run, encode it. */
if (rle_cnt) {
putc((unsigned char) prev, out);
putc((unsigned char) rle_cnt-1, out);
rle_cnt = 0;
}
/* then encode the new byte. */
putc((unsigned char) c, out);
prev = c;
}
else {
/* increment count; if count == 256, encode it. */
if ((++rle_cnt) == 256) {

22


Ứng dụng phương pháp Move to front trong nén dữ liệu

/* the first byte of the 256 bytes. */
putc((unsigned char) prev, out);
/* the next 255 bytes. (rle_cnt-1) == 255. */
putc((unsigned char) 255, out);
rle_cnt = 0;

}
}
}
/* if there's a run, encode it. */
if (rle_cnt) {
putc((unsigned char) prev, out);
putc((unsigned char) rle_cnt-1, out);
}
2.1.3 Giải mã
Thuật toán giải mã:
Đọc một byte, kết xuất byte, và gán vào biến X.
Bước lặp
Đọc byte tiếp theo và gán vào biến Y
Nếu X bằng Y?
Nếu đúng
o

Đọc byte tiếp theo Z là số lần lặp

o

Kết xuất byte Y

o

Kết xuất Z lần byte X

o

Gán byte cuối cùng vào X.


o

Quay lại bước lặp.

Nếu không đúng
o

Kết xuất byte Y

o

Gán Y vào X.

o

Quay lại bước lặp.

23


Ứng dụng phương pháp Move to front trong nén dữ liệu

Đoạn mã nguồn như sau:
if ((c=getc(in)) != EOF) {
prev = c;
putc((unsigned char) c, out);
}
else return;
while ((c=getc(in)) != EOF) {

if (c == prev) {
putc((unsigned char) prev, out);
//

output the next "run" of bytes, as

//

stored in the rle_cnt variable.

if ((rle_cnt = getc(in)) != EOF) {
while(rle_cnt--) {
putc((unsigned char) prev, out);
}
}
else break;
}
else {
putc((unsigned char) c, out);
prev = c;
}
}
Ví dụ ta có : "aaaaaabcddccc" Áp dụng thuật toán nén RLE, sau khi nén ta
được kết quả: “aa4bcdd0cc1”.
2.2 Thuật tốn mã hóa Huffman
2.2.1 Giới thiệu thuật tốn mã hóa Huffman
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

24



Ứng dụng phương pháp Move to front trong nén dữ liệu

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
E, A, O, T thường xuyên xuất hiện nhiều hơn các chữ cái J, Q, X [6].
Xét các chữ cái có độ dài từ mã là 8-bit theo bảng mã ASCII. Ý tưởng của
thuật tố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.
Để rõ hơn ta xét chuỗi ký tự “BURROW WHEELER”, để đơn giản ta bỏ qua
dấu cách. Ta có bảng tần số xuất hiện của các ký tự:
B U R O W H E L
1 1 3 1 2 1 3 1
Sau đó sắp xếp các ký tự theo tần số xuất hiện
B U L O H W E R
1 1 1 1 1 2 3 3
Ta có bảng ký tự của dữ liệu nguồn là (B, U, L, O, H, W, E, R) với số lần
xuất hiện tương ứng là (1, 1, 1, 1, 1, 2, 3, 3). Khi đó ta xây dựng bảng ký tự có độ
dài mã thay đổi.
Dữ liệu vào của thuật toán Huffman là chuỗi ký tự. Dữ liệu ra là chuỗi các
bit nhị phân tương ứng với chuỗi ký tự vào. Để giải quyết vấn đề này ta xét ba vấn
đề nhỏ sau:
1. Đọc dữ liệu vào.
2. Mã hóa mỗi ký tự vào.
3. Kết xuất từ mã cho mỗi ký tự vào (nén).
Để giải quyết vấn đề 1 ta cần tổ chức dữ liệu vào sao cho có thể đọc được
từng ký tự ở chuỗi dữ liệu vào, trong luận văn này tác giả định dạng tệp tin dưới
dạng byte, mỗi mẩu tin đọc vào là một byte có mã tương ứng trong bảng mã
ASCII.


25


Ứng dụng phương pháp Move to front trong nén dữ liệu

Đối với vấn đề 2 ta cần xây dựng cây nhị phân theo quy tắc sau:
- Sắp xếp danh sách L các ký hiệu tăng dần theo tần số xuất hiện
- Coi mỗi ký hiệu là một nút lá của cây nhị phân, mỗi nút lá là một cây con.
- Kết hợp hai cây con có gốc là giá trị tần số xuất hiện của hai cây con này,
sau đó bổ sung gốc vào danh sách L theo thứ tự tăng dần của tần số xuất hiện. Thực
hiện bước này cho đến khi chỉ còn một gốc.
Để giải quyết vấn đề 3 ta cần tìm từ mã tương ứng với mỗi ký tự và kết xuất
từ mã. Để tìm một từ mã tương ứng với ký hiệu ta duyệt cây nhị phân từ nút gốc tới
nút lá. Trong quá trình duyệt nếu đi sang cây con trái ta có bit 0, nếu đi sang cây
con phải ta có bit 1, đường đi từ nút gốc tới nút lá là độ dài từ mã.
Ta có thể minh họa theo các bước sau:

26


×