1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Các kỹ thuật kiểm thử đột biến và ứng dụng kiểm thử chương trình c

69 20 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 69
Dung lượng 656,96 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bước đầu tiên trong thuật toán nén dữ liệu BWCA là phép biến đổiBurrow-Wheeler transform [9] được giới thiệu lần đầu tiên vào năm 1994 bởi haitác giả là Burrow và Wheeler, BWT biến đổi v

Trang 1

Vũ Văn Minh

ĐỀ TÀI ỨNG DỤNG PHƯƠNG PHÁP

MOVE-TO-FRONT TRONG NÉN DỮ LIỆU

Chuyên ngành: Bảo đảm toán học cho máy tính

và hệ thống tính toá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

Trang 2

DANH MỤC HÌNH VẼ, BẢNG BIỂU

DANH MỤC CÁC TỪ VIẾT TẮT

Mở đầ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

1.2 Dữ liệu ký hiệu

1.3 Sự thay đổi độ dài mã

1.3.1 Tính duy nhất để giải mã

1.3.2 Mã tiền tố và cây nhị phân

1.4 Cơ bản về lý thuyết thông tin

1.4.1 Entropy

1.4.2 Mã tối ưu

1.5 Sự dư thừa dữ liệu

1.6 Nén dữ liệu

1.6.1 Nén và giải nén dữ liệu

1.6.2 Nén có mất thông tin và nén không mất thông tin

1.6.3 Nén theo khối dữ liệu

1.7 Mã hóa Entropy

1.7.1 Mã hóa Huffman

1.7.2 Mã hóa số học

Chương 2 NÉN DỮ LIỆU VÀ PHƯƠNG PHÁP MOVE-TO-FRONT

2.1 Thuật toán mã hóa độ dài (RLE)

2.1.1 Giới thiệu RLE

Trang 3

2.1.2 Mã hóa 21

2.1.3 Giải mã 23

2.2 Thuật toán mã hóa Huffman 24 2.2.1 Giới thiệu thuật toá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

Trang 4

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

Trang 5

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ả quá trình mã hóa MTF 46

Bảng 8 Mô tả quá 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

Trang 6

DANH MỤC CÁC TỪ VIẾT TẮT

TT Từ viết tắt Viết đầy đủ

1 ASCII American Standard Code for Information Interchange

9 JPEG Joint Photographic Experts Group

Trang 7

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 đượcdùng như là bước thứ hai trong thuật toán nén dữ liệu Burrow-Wheeler compressionalgorithm [10] Bước đầu tiên trong thuật toán nén dữ liệu BWCA là phép biến đổiBurrow-Wheeler transform [9] được giới thiệu lần đầu tiên vào năm 1994 bởi haitác giả là Burrow và Wheeler, BWT biến đổi vị trí các ký hiệu sao cho các ký hiệugiống nhau sẽ đứng cạnh nhau, bước tiếp theo của thuật toán này là phương phápMTF, 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 toá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ácnhau như văn bản, hình ảnh, âm thanh hoặc phim Luận văn này tập trung nghiêncứ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

Trang 8

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ảmnhậ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 mangthô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ôngtin 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àytạ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áctệ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ộtmẩ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 tinnà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 tinphù 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ướidạ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

Trang 9

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ácphầ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 toá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à quá 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ụnghầ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

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ệcbiến đổi các ký tự s để được c gọi là quá trình mã hóa, ngược lại biến đổi từ c

Trang 10

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ácnhau, mỗi ký tự có độ dài mã là 8-bit Để biểu diễn chuỗi ký tự S=“banana” theocá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ệuchí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ảntá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ị

Trang 11

đượ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 đọclầ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 Trongtrườ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ôngbằ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 đếnnú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ừ

Trang 12

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ácnú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 toàn; lưutrữ 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ệulấ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êuthô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ínhiệ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 hoàn toà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

Trang 13

dòng chữ vẫn đang được viết hay đang được truyền tải, khó có thể đoá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

Trang 14

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=(l 1 , l 2 , …, l n) 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ã trungbì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átthô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ằngentropy của dữ liệu nguồn tức là E(P, L) nhỏ hơn hoặc bằng 100% Khi khoảngcá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ớ ngoà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

Trang 15

Ví dụ 2: Một chuỗi ký tự không lặp lại liên tiếp “ABACAA” nhưng ta lạithấ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ênhơ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ấthiệ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óangắ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ừatrong 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ậttoá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ậttoá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ácnhau để 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 choviệc nén dữ liệu trở nên khó khăn hơn khi tìm ra một thuật toán nén chung

Không có thuật toán nào hoà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 đặctí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ế chocá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ănbản, hình ảnh, âm thanh hay phim Mục đích của nén dữ liệu là để thể hiện dữ liệudạ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 toán giảinén phụ thuộc vào quá trình nén

Trang 16

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 toá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

phục dữ liệu ban đầu thì thông tin không

mất trong quá trình nén Hình 3 minh họa

là phương pháp nén dữ liệu mà khi khôi

bị mất, tức là không có thông tin nào bịnén dữ liệu không mất thông tin

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 đoá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

Trang 17

3.1415926 Nén dữ liệu 0001100111101

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 toá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

Trang 18

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”

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 toàn bộ thông điệp thành số

thực n (single number) (0.0 ≤ n < 1.0).

Trang 19

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 toá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; haiphương pháp biến đổi dữ liệu đầu vào là phép biến đổi Burrow-Wheeler và Move tofront

2.1 Thuật toá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ậttoá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àicủ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ấtnhiề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êntiế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ếtxuất ra ‘aa’ và số lần xuất hiện ký hiệu này

a a 6RLE

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:

Trang 20

RLE a 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énchú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ácnhau:

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ặpNếu không đúng

o Đặt byte thứ hai như là byte đầu tiên o Đọc byte tiếp theo như là byte

thứ hai

Trang 21

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:

}/* then encode the new byte */

putc((unsigned char) c, out);

prev = c;

}else {

/* increment count; if count == 256, encode it */ if ((++rle_cnt) == 256) {

Trang 22

/* 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 YNế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 Quay lại bước lặp.

Trang 23

Đ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);

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 toán mã hóa Huffman

2.2.1 Giới thiệu thuật toá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 trongvă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

Trang 24

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ủathuậ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

Để rõ hơn ta xét chuỗi ký tự “BURROW WHEELER”, để đơn giản ta bỏ quadấu cách Ta có bảng tần số xuất hiện của các ký tự:

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 bitnhị 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:

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 đượctừ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ướidạng byte, mỗi mẩu tin đọc vào là một byte có mã tương ứng trong bảng mã ASCII

Trang 25

Đố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ựchiệ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ớinú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 conphả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:

Trang 26

Hình 7 Minh họa nén theo phương pháp Huffman

Trên mỗi nhánh của cây nhị phân ta gán các trị 0 hoặc 1 vào cây Giá trị 0gán vào nhánh bên trái, giá trị 1 gán vào nhánh bên phải Cuối cùng ta có cây nhịphân như sau – còn được gọi là cây Huffman:

Hình 8 Cây Huffman trong nén dữ liệu

Sau khi thiết lập cây Huffman ta có bảng ký tự với độ dài mã ứng với từng

‘B’, ‘U’, ‘L’, ‘O’ có số lần xuất hiện ít hơn sẽ có độ dài mã là 4

Tuy nhiên, để có thể giải mã được dữ liệu đã nén, ta phải lưu trữ bảng ký hiệu cùng với tần suất xuất hiện các ký hiệu vào tệp tin nén

Trang 27

2.2.2 Mã hóa Huffman

Thuật toán nén theo Huffman được tiến hành từng bước như sau:

1) Đọc từng ký tự ở tệp nguồn

2) Tìm ký tự đó ở nút lá của cây nhị phân

3) Duyệt từ nút lá đến nút gốc, trên đường đi thu nhận các bit 0 hoặc 1, ta được

chuỗi bit của từng ký tự

4) Đảo lại vị trí các bit của chuỗi ký tự thu được và bổ sung vào vùng đệm (nếu sốbit ở vùng đệm lớn hơn hoặc bằng 8 bit ta ghi ký tự thu được vào tệp đích)

5) Lặp lại các bước trên cho đến khi hết ký tự ở tệp nguồn

Ví dụ đối với dãy ký tự “BURROW WHEELER” sau khi nén ta được chuỗi

bit sau:

Như vậy thay vì lưu trữ 13-byte ASCII hết 104 bit thì với thuật toán

Huffman ta lưu trữ với 5 byte trong đó có 37 bit thực

Sau đây là đoạn mã nén dữ liệu theo phương pháp Huffman, trong đó:

- hufflist là danh sách các nút lá của cây nhị phân nbit = 0;

Trang 28

t = (t << 1) | 1;

}node = node->parent;

}while (k ){

2.2.3 Giải mã Huffman

Thuật toán giải nén được thực thi như sau:

1) Đọc từng ký tự ở tệp nguồn

2) Duyệt từ gốc của cây tới nút lá căn cứ vào giá trị bit đọc được từ ký tự (nếu

bit có trị 1 ta duyệt tiếp con bên phải, nếu bit có trị 0 ta duyệt tiếp con bên trái)

3) Ghi giá trị nút lá vào tệp đích

4) Lặp lại các bước trên cho tới khi hết tệp nguồn

Đối với ví dụ trên (hình 8), với chuỗi bit vào là:

Trang 29

Sau đây là đoạn mã giải nén dữ liệu theo phương pháp Huffman, trong đó top

là gốc của cây nhị phân

}nbit ;

}else{

putc(node->ch, OUT);

node = top;

}}}

Trang 30

Ví dụ Xét bảng mã nhị phân (A, B) với xác suất (PA, PB) được phân bốtương ứng là (0.2, 0.8).

Khởi tạo đoạn [0,1) như hình 9(a)

Giả sử rằng chuỗi ký hiệu đầu vào chỉ chứa 1 ký hiệu Khi đó đoạn [0,1)được chia thành hai đoạn con tương ứng với phân bố xác suất hai ký hiệu A, B là

PA, PB như hình 9(b)

Giả sử chuối ký hiệu đầu vào chứa hai ký hiệu, mỗi đoạn con lại được chiathành hai đoạn con tương ứng cho hai ký hiệu như hình 9(c)

Trang 31

Tương tự ta có thể mở rộng bảng mã nhị phân, khi đó mỗi chuỗi có mối quan

hệ một-một với mỗi đoạn con duy nhất như bảng

Bảng 3 Bảng mã nhị phân mở rộng với hai ký hiệu

Tuy nhiên, không cần phải mở rộng bảng mã nhị phân và tính toán xác suất

mỗi khi kết hợp ký hiệu Giả sử ta có chuỗi “ABBBAABAAA” gồm 10 ký hiệu với

sự phân bố xác suất (A, B) tương ứng là (0.2, 0.8) Đầu tiên thay vì mở rộng bảng

mã cần phải tới 210 phần tử thì ta tính xác suất tích lũy của ABBBAABAAA tương

ứng như sau 0.2 × 0.8 × 0.8 × 0.8 × 0.2 × 0.2 × 0.8 × 0.2 × 0.2 × 0.2 = 0.000026214

Cuối cùng kết quả 0.000026214 được dùng để mã hóa và giải mã Các ký hiệu tiếp

theo ta cần tính cận trên (high) và cận dưới (low) của phân đoạn các ký hiệu

Kết quả đầu ra của thuật toán nén số học là một số thực trong khoảng [0, 1)

Số thực này là số duy nhất để giải mã chính xác chuỗi ký hiệu được mã hóa

Thuật toán nén số học vượt qua các rào cản đối với thuật toán Huffman

Thuật toán này mã hóa một chuỗi các ký hiệu liên tiếp thay vì mã hóa từng ký hiệu

đơn Điều này làm giảm sự khác nhau giữa entropy và độ dài trung bình của các ký

hiệu Thuật toán nén số học (tĩnh) không đưa ra bất cứ một từ mã nào cho tới khi xét

tới toàn bộ khối dữ liệu đầu vào

2.3.2 Mô hình nén số học

Mô hình nén số học cũng tương tự như mô hình nén Huffman Nó dựa trên

bảng ký hiệu và sự phân bố xác suất của các ký hiệu Xác suất các ký hiệu được tính

Trang 32

tuần tự chính xác từ dữ liệu nguồn, yêu cầu này cần phải đọc toàn bộ tệp nguồntrước khi mã hóa.

Giống như nén Huffman, nén số học cũng có hai mô hình đó là dạng tĩnh vàdạng động Mô hình động là ta tính xác suất của các ký hiệu ngay trong quá trình xử

lý, nghĩa là không phải đọc toàn bộ tệp tin để biết xác suất của các ký tự rồi mới xử

lý nén dữ liệu Trong luận văn này tác giả trình bày thuật toán nén số học dạng tĩnh

Sau khi đã chia các đoạn cho các ký hiệu, ta sẽ đọc từng ký hiệu trong tệpnguồn, mỗi lần đọc một phân đoạn con mới được nhận ra theo xác suất của ký hiệunhập vào Ta thiết lập phân đoạn khởi đầu là [0,1), quá trình này được lặp lại chođến khi kết thúc chuỗi ký hiệu Sau đó phương pháp nén số học kết xuất một số thựcbên trong phân đoạn con cuối cùng của khối đang xét

Ký hiệu đoạn khởi đầu là [L, L + d) trong đó biến L lưu trữ giá trị thấp nhấtcủa phân đoạn và d lưu trữ khoảng cách giữa giá trị thấp nhất và giá trị cao nhất củaphân đoạn Các bước sau mô tả điều này:

1 Đặt phân đoạn khở đầu là [0, 1)

2 Lặp lại các bước sau cho tới khi kết thúc khối dữ liệu vào

2.1 Đọc ký hiệu s tiếp theo trong khối dữ liệu vào

2.2 Chia đoạn hiện tại thành các đoạn con sao cho kích thước của chúng tương ứng với xác suất của các ký hiệu

2.3 Cập nhật phân đoạn hiện tại ứng với ký hiệu s

3 Khi kết thúc khối dữ liệu vào, kết xuất số thực trong phân đoạn hiện tại.Hình 10 minh họa phân đoạn với khối dữ liệu “IOU”, kết thúc quá trình xử lýnày, thuật toán kết xuất số thực trong phân đoạn [0.37630, 0.37819)

Trang 33

Hình 10 Minh họa phân đoạn với khối dữ liệu “IOU”

Mã số học áp dụng đối với 2 ký hiệu

Đặt P1 là xác suất của ký hiệu s1

P2=1-P1 Đặt phân đoạn hiện tại là mãn

[L, L+d × P1) và [L+d × P1, L+d × P1 + d × P2)Chú ý là L+d × P1 + d × P2 = L + d (P1 + P2) = L + d

Thuật toán nén như sau:

2: Đọc ký tự tiếp theo

3: If ký tự là s1 then

Trang 34

Giải mã số học áp dụng đối với 2 ký hiệu

Đặt P1 là xác suất của ký hiệu s1 và P2 là xác suất của ký hiệu s2, trong đó

P2=1-P1 Cho phân số x trong khoảng [0, 1) và độ dài của khối dữ liệu nguồn, khối

dữ liệu nguồn có thể được giải mã như sau:

2.3.3 Trường hợp tổng quát trong nén số học

Đặt S = (s1, s2, …, sn) là các ký hiệu của khối dữ liệu nguồn tương ứng với

sự phân bố xác suất xảy ra của các ký hiệu là P = (p1, p2, …, pn) Các đoạn con đốivới mỗi lần lặp có thể được suy ra tùy theo xác suất của mỗi ký hiệu

Ngày đăng: 19/11/2020, 20:35

🧩 Sản phẩm bạn có thể quan tâm

w