Biến đổi BWT thuận

Một phần của tài liệu Nén dữ liệu kết hợp với các phương pháp biến đổi sơ bộ dữ liệu (Trang 42)

Input: LAHABANA

1. Tạo ra tất cả các thay đổi quay vịng của chuỗi dữ liệu và liệt kê chúng theo thứ tự; sau mỗi lần thay đổi, phần tử đầu tiên của dãy cũ sẽ đƣợc chuyển về vị trí cuối cùng của dãy mới.

Shift:

Hình 2.1: Quá trình quay chuỗi “LAHABANA”

2. Sắp xếp các chuỗi theo thứ tự từ điển. (Sử dụng bubblesort, quicksort, suffix array sort, suffix tree sort, …)

Sort:

Hình 2.2: Kết quả sắp xếp theo th tự từ điển

Đầu ra của BWT là cột cuối cùng của khối và đƣợc lƣu trữ bằng một mảng W = {H, L, N, B, A, A, A, A} và một chỉ số của dịng cĩ ký tự là ký tự đầu tiên của chuỗi đầu vào; đây là một lựa chọn duy nhất (chỉ cĩ một L trong LAHABANA). Chỉ số này đƣợc gọi là chỉ số chính. Chỉ số K = 1 đƣợc dùng để giải mã.

Output: HLNBAAAA; K=1

Code của quá trình mã hĩa BWT

Dữ liệu đầu vào: mảng S cĩ n phần tử Dữ liệu đầu ra:

 W chứa cột cuối cùng của khối sau khi sắp xếp

 Chỉ số chính K

Biến sử dụng trong thuật tốn

Thay vì sử dụng n mảng để lƣu trữ n phép quay, ta cĩ thể chỉ sử dụng 1 mảng theo kiểu quay vịng và sắp xếp dữ liệu trên đĩ. Vì vậy p dùng để lƣu trữ tạm chỉ số các giá trị trong mảng S, phục vụ cho quá trình sắp xếp.

Code:

// sanh 2 xau vong s[i..] va s[j..]

inline bool Less(const UC s[], int n, int i, int j)

{ int ik, jk;

for (int k = 0; k < n; ++k) { ik = (i+k)%n; jk = (j+k)%n;

if (s[ik] != s[jk])

return (s[ik] < s[jk]) ? TRUE : FALSE; }

return (i < j) ? TRUE : FALSE; }

void QuickSort(const UC s[], int n, int d, int c) { int i = d, j = c, m = p[(i+j)/2], t;

while (i <= j) {

while (Less(s,n,p[i],m)) ++i; while (Less(s,n,m,p[j])) --j; if (i <= j) { if (i < j) { t = p[i]; p[i] = p[j]; p[j] = t; } ++i; --j; } } if (d < j) QuickSort(s, n, d, j); if (i < c) QuickSort(s, n, i, c); }

int BW(const UC s[], int n, UC w[]) { // int p[MN];

// cout << endl << " Cap phat p: "; cin.get(); int r, i;

for (i = 0; i < n; ++i) p[i] = i; cout << endl << " Call Sort"; QuickSort(s,n,0,n-1);

// BubbleSort(s,p,n);

cout << endl << " End of Sort "; // cin.get(); // for (int i = 0; i < n; ++i) Print(s, n, p[i], "\n");

w[i] = s[(p[i]+(n-1))%n]; if (p[i] == 0) r = i; } w[n] = '\0'; return r; } 2.1.1.2 Biến đổi BWT nghịch

Đầu ra của BWT là cột cuối cùng trong ma trận sắp xếp, gọi đĩ là cột L. Sắp xếp đầu ra của BWT sẽ nhận đƣợc cột đầu tiên của ma trận sắp xếp, gọi là cột F.

1. Sort: AAAABHLN

2. Viết chuỗi L và F cạnh nhau, cùng với các chỉ số:

3. Tạo một "véc tơ chuyển đổi" T[i]

Để tính đƣợc giá trị của T[i], chúng ta dựa vào vị trí của ký tự đĩ trong chuỗi F. Giả sử ký tự đĩ xuất hiện thứ j trong chuỗi F; quét qua chuỗi L để tìm sự xuất hiện thứ j của ký tự đĩ. Khi đĩ vị trí của ký tự này trong L đƣợc ghi nhận là giá trị của T [i]. F[0] A thứ 1 trong F. L[4] A thứ 1 trong L. T[0] = 4 F[1] A thứ 2 trong F. L[5] A thứ 2 trong L. T[1] = 5 F[2] A thứ 3 trong F. L[6] A thứ 3 trong L. T[2] = 6 F[3] A thứ 4 trong F. L[7] A thứ 4 trong L. T[3] = 7 F[4] B thứ 1 trong F. L[3] B thứ 1 trong L. T[4] = 3 F[5] H thứ 1 trong F. L[0] H thứ 1 trong L. T[5] = 0 F[6] L thứ 1 trong F. L[1] L thứ 1 trong L. T[6] = 1 F[7] N thứ 1 trong F. L[2] N thứ 1 trong L. T[7] = 2

Khởi tạo với giá trị của chỉ số chính; L [chỉ số chính] và thiết lập các chỉ số T; lặp lại cho đến khi đạt đƣợc chỉ số chính một lần nữa.

Giải mã: Đọc chỉ số chính. Giá trị: 1 Index = 1 L[1] = L T[1] = 5 Index = 5 L[5] = A T[5] = 0 Index = 0 L[0] = H T[0] = 4 Index = 4 L[4] = A T[4] = 3 Index = 3 L[3] = B T[3] = 7 Index = 7 L[7] = A T[7] = 2 Index = 2 L[2] = N T[2] = 6 Index = 6 L[6] = A T[6] = 1

Index = 1 Primary index reached, end of string. Output: LAHABANA

Ta cĩ thể minh họa quá trình tìm kiếm qua hình 2.3:

Hình 2.3: Mơ tả quá trình biến đ i B T nghịch

Code quá trình biến đổi BWT nghịch

// sanh s[i] s[j]

inline bool Less(const UC s[], int i, int j) { if (s[i] < s[j]) return TRUE;

if (s[i] > s[j]) return FALSE; // s[i] == s[j]

return (i < j) ? TRUE : FALSE; }

void QuickSortw(const UC w[], int d, int c) { int i = d, j = c, m = p[(i+j)/2], t;

while (i <= j) {

while (LESS(w,p[i],m)) ++i; while (LESS(w,m,p[j])) --j; if (i <= j) { if (i < j) { t = p[i]; p[i] = p[j]; p[j] = t; } ++i; --j; } } if (d < j) QuickSortw(w, d, j); if (i < c) QuickSortw(w, i, c); }

UC * WB(const UC w[], int n, int d, UC s[]) { // int p[MN];

int r, i;

for (i = 0; i < n; ++i) p[i] = i; QuickSortw(w,0,n-1);

d = p[d]; for (i = 0; i < n; ++i) { s[i] = w[d]; d = p[d]; } s[n] = '\0'; return s; }

2.1.2 Kỹ thuật biến đổi Move-To-Front (MTF)

MTF là quá trình các ký tự của dữ liệu đầu vào luơn đƣợc dịch chuyển lên đầu danh sách. Điều này d n đến các phần tử giống nhau liền kề nhau sẽ nhận đƣợc giá trị 0 (đầu ra là chỉ số của ký tự trong danh sách lƣu trữ của quá trình thực hiện MTF). Sau quá trình MTF, dãy đƣợc tạo ra dài bằng dãy ban đầu nhƣng sẽ cĩ nhiều giá trị 0 nếu dữ liệu đầu vào cĩ các phần tử giống nhau và đi liền kề với nhau.

Quá trình biến đổi MTF thuận và biến đổi MTF nghịch sẽ đƣợc giải thích thơng qua ví dụ của xâu đầu vàolà xâu đầu ra của BWT: W= “HLNBAAAA”

2.1.2.1 Biến đổi MTF thuận

MTF biến đổi dãy biểu tƣợng đầu vào thành một dãy chỉ số. Với mỗi biểu tƣợng đầu vào của wi, một chỉ số đầu ra đƣợc đƣa ra cho ui. Để tính tốn các giá trị chỉ số, một danh sách các biểu tƣợng bảng chữ cái đƣợc sử dụng, đƣợc sắp xếp bằng các xuất hiện mới nhất của các biểu tƣợng bảng chữ cái. Khi bắt đầu, danh sách đƣợc sắp xếp theo thứ tự từ điển tăng dần. Mỗi lần một biểu tƣợng của wi đƣợc xử lý, biểu tƣợng bảng chữ cái tƣơng ứng đƣợc định vị trong danh sách, chỉ số hiện hành của biểu tƣợng đƣợc đƣa ra cho ui và biểu tƣợng đĩ đƣợc đƣa lên vị trí 0 trong danh sách.

Bảng 2.1: Quá trình mã hĩa MTF

Đổi tên biểu tƣợng Danh sách biểu tƣợng Các ký hiệu mã hĩa

HLNBAAAA ABHLN LNBAAAA HABLN 2 NBAAAA LHABN 2, 3 BAAAA NLHAB 2, 3, 4 AAAA BNLHA 2, 3, 4, 4 AAA ABNLH 2, 3, 4, 4, 4 AA ABNLH 2, 3, 4, 4, 4, 0 A ABNLH 2, 3, 4, 4, 4, 0, 0 2, 3, 4, 4, 4, 0, 0, 0 Output: U = {2, 3, 4, 4, 4, 0, 0, 0}

Ta cĩ thể minh họa quá trình mã hĩa MTF qua hình 2.4:

* Code

void InitCode() {

int cs = CODE_SIZE-1;

for (int i = 0; i < cs; ++i) mtfcode[i] = i+1; mtfcode[cs] = 0;

}

int Find(UC c) { int i;

for (i = 0; i < CODE_SIZE; ++i) if (mtfcode[i] == c) return i; } void ShiftCode(int p) { if (p > 0) { char c = mtfcode[p]; memmove((mtfcode+1),mtfcode,p*sizeof(char)); mtfcode[0] = c; } } // Move-To-Front // input: w[] // output: w[]

void MTF(UC w[], int n) { int i, c; InitCode(); for (i = 0; i < n; ++i) { c = w[i]; w[i] = Find(c); ShiftCode(w[i]); } }

2.1.2.2 Biến đổi MTF nghịch

Khơng giống nhƣ BWT nghịch, Move-To-Front (MTF) nghịch khá đơn giản, nĩ rất giống quá trình mã hĩa. Danh sách bắt đầu theo một thứ tự từ điển. Dữ liệu đã đƣợc mã hĩa cho biết vị trí của biểu tƣợng đƣợc giải mã. Sau khi giải mã biểu tƣợng, di chuyển nĩ lên đầu danh sách.

Ta cĩ thể hình dung quá trình biến đổi MTF nghịch qua bảng 2.2:

Bảng 2.2: Quá trình giải mã MTF

Đổi tên biểu tƣợng Danh sách biểu tƣợng Biểu tƣợng đƣợc giải mã 2, 3, 4, 4, 4, 0, 0, 0 ABHLN 3, 4, 4, 4, 0, 0, 0 HABLN H 4, 4, 4, 0, 0, 0 LHABN H L 4, 4, 0, 0, 0 NLHAB H L N 4, 0, 0, 0 BNLHA H L N B 0, 0, 0 ABNLH H L N B A 0, 0 ABNLH H L N B A A 0 ABNLH H L N B A A A H L N B A A A A Output: H L N B A A A A

Hình 2.5: Quá trình biến đ i MTF nghịch

Nhƣ vậy, MTF cĩ xu hƣớng tăng tần số của các biểu tƣợng cĩ giá trị thấp trong một khối. Điều này làm cho MTF hữu ích cho việc cải thiện nén các bộ mã hĩa thống kê nhƣ mã hĩa Huffman hoặc mã hĩa số học.

Code quá trình giải mã:

void InitCode() {

int cs = CODE_SIZE-1;

for (int i = 0; i < cs; ++i) mtfcode[i] = i+1; mtfcode[cs] = 0;

}

int Find(UC c) { int i;

for (i = 0; i < CODE_SIZE; ++i) if (mtfcode[i] == c) return i; }

void ShiftCode(int p) { if (p > 0) {

memmove((mtfcode+1),mtfcode,p*sizeof(char)); mtfcode[0] = c; } } // MTF Inverse // input w[] // output w[]

void InvMTF(UC w[], int n) { int i, c; InitCode(); for (i = 0; i < n; ++i) { c = w[i]; w[i] = mtfcode[c]; ShiftCode(c); } }

2.2 Một số cải tiến đối với thuật tốn MTF

Nhiều cố gắng cải tiến các đặc tính của giai đoạn MTF nhƣ các phiên bản M1 và M2 của Schindler, thuật tốn MTF-1 từ Balkenhol, Kurtz, Shtarkov và thuật tốn MTF-2 từ Balkenhol và Shtarkov. Các phiên bản M1 và M2 sử dụng các cờ để cĩ đƣợc một dãy đầu ra, làm tăng số lƣợng của các ký tự xếp hạng 0 với chi phí của các ký tự xếp hạng 1, tức là đƣa ra nhiều các ký tự 0. MTF-1 chỉ đƣa các ký tự từ vị trí thứ hai lên đầu danh sách, trong khi các ký tự với các vị trí cao hơn đƣợc đƣa lên vị trí thứ hai. MTF-2 khác với MTF-1 là các ký tự từ vị trí thứ hai đƣợc đƣa lên đầu danh sách chỉ khi giá trị bảng xếp hạng cuối cùng là khơng bằng 0, tức là nếu các ký tự tƣơng tự xảy ra lần nữa.

Thuật tốn MTF cải tiến sẽ đƣợc giải thích thơng qua ví dụ của xâu đầu vào là xâu đầu ra của BWT: W= “HLNBAAAA”

2.2.1 Quá trình mã hĩa

Quá trình mã hĩa, ta cĩ thể hình dung quá trình qua hình 2.6 sau:

Hình 2.6: Quá trình mã hĩa MTF (cải tiến)

Code quá trình mã hĩa

void InitCode() {

for (int i = 0; i <= 255; ++i) mtfcode[i] = i;

}

void MTF(int W[], int U[], int n){ for(i=0; i<n; i++){

int c = W[i]; int a = mtfcode[c]; U[i] = a; if(a!=0){ for(k=0; k <= 255 ; k++) if(mtfcode[k]<a ) mtfcode[k]++; mtfcode[c] = 0; } } 4 4 4 4

2.2.2 Quá tr nh giải mã

Quá trình giải mã đƣợc thể hiện qua hình 2.7:

Hình 2.7: Quá trình giải mã MTF (cải tiến)

Code:

void MTF(int W[], int U[], int n){ InitCode();

for(i=0; i<n; i++){ if(U[i] == 0) W[i] = W[i-1]; else{ int c; for(k=0; k <= 255 ; k++) if(mtfcode[k] == U[i]) c = k;

else if(mtfcode[k] < U[i])

mtfcode[k]++;

W[i] = c ;

mtfcode[c] = 0; }

2.3 Mơ hình nén kết hợp với BWT&MTF

Lƣợc đồ nén dữ liệu dựa trên kết hợp các kỹ thuật biến đổi BWT & MTF làm thay đổi tính chất của dữ liệu đầu vào để cĩ thể cho kết quả nén tốt hơn cĩ 3 giai đoạn. Mỗi giai đoạn sẽ xử lý và biến đổi khối dữ liệu để tạo dữ liệu đầu vào cho giai đoạn tiếp theo.

2.3.1 Quá trình nén

Hình 2.8: Lược đồ n n dữ liệu B T_MTF_EC

Giai đoạn đầu tiên của thuật tốn nén là phép biến đổi BWT. Mục đích của giai đoạn này là sắp xếp dữ liệu theo cách mà các ký tự cĩ cùng ngữ cảnh nhĩm lại gần nhau hơn. BWT khơng làm thay đổi số lƣợng các ký hiệu cĩ trong khối dữ liệu, mà chỉ thêm 1 giá trị là chỉ số của phần tử đầu tiên của dữ liệu đầu vào ở bảng kết quả. Dựa vào chỉ số này mà ta cĩ thể phục hồi lại đƣợc khối dữ liệu ban đầu. Chỉ số này là một số nguyên cĩ giá trị từ 0 đến n-1 (n là số lƣợng ký tự trong khối dữ liệu nguồn), và nĩ đƣợc đặt tại vị trí đầu tiên của khối dữ liệu đầu ra đƣợc mã hĩa bằng BWT.

Giai đoạn thứ hai là phƣơng pháp dịch chuyển MTF. MTF là một thuật tốn thay thế lại nội dung khối dữ liệu bằng chỉ số của dữ liệu trên mảng trung gian đƣợc dùng để thực hiện thuật tốn, sau đĩ phần tử này đƣợc chuyển về đầu mảng. Chính vì vậy các dữ liệu giống nhau đi sát với nhau sẽ nhận giá trị 0. MTF cũng khơng làm thay đổi kích thƣớc khối dữ liệu. Vì MTF đƣợc áp dụng ngay sau BWT nên trong dãy kết quả của MTF sẽ cĩ rất nhiều số 0.

Giai đoạn cuối cùng là giai đoạn EC, giai đoạn này nén luồng chỉ số từ giai đoạn MTF thành luồng bit cĩ kích thƣớc nhỏ.

Ta cĩ thể hình dung các giai đoạn qua các quá trình sau: Giả sử dữ liệu cần nén là: "1213112301"

BWT MTF EC

Biểu diễn dữ liệu dƣới dạng mã ASCII : 49 50 49 51 49 49 50 51 48 49

 BWT thuận

Quá trình thực hiện BWT qua bảng sau:

Hình 2.9: Kết quả thực nghiệm v i B T (quá trình thuận)

Output: 51 48 51 49 49 50 49 49 50 49; K = 6

 MTF thuận

Quá trình chuyển đổi đƣợc thực hiện qua bảng sau:

Hình 2.10: Kết quả thực nghiệm v i MTF (quá trình thuận)

 Với HUFFMAN Cây Huffman

Bộ mã tối ƣu tƣơng ứng là:

2 0 3 1 000 001 01 1

Output: 01110000 01011001 11

2.3.2 Quá tr nh giải nén

Hình 2.11: Lược đồ giải n n dữ liệu B T_MTF_EC

 De_Huff: dữ liệu đầu vào dãy bit 01110000 01011001 11 giải nén ta đƣợc dãy: 3 1 1 2 0 3 1 0 1 1

 InvMTF: quá trình giải mã đƣợc thể hiện qua bảng sau:

Hình 2.12: Kết quả thực nghiệm MTF (quá trình nghịch)

De_EC InvMTF InvBWT

Input Output 0 10 5 1 3 3 2 0 1 2 2 5 0 0 1 1 1

 InvBWT:

Dữ liệu đầu vào là dãy kết quả từ InvMTF và chỉ số K=6, quá trình biến đổi nghịch thể hiện qua hình 2.13.

Hình 2.13: Kết quả thực nghiệm B T (quá trình nghịch)

CHƢƠNG III: KẾT QUẢ CÀI ĐẶT THỬ NGHIỆM

Chƣơng 2 đã tìm hiểu về các kỹ thuật biến đổi sơ bộ BWT, MTF và mơ hình nén kết hợp với BWT&MTF. Dựa trên cơ sở lý thuyết, xây dựng cài đặt chuyển đổi trên dữ liệu thực.

Chƣơng trình cài đặt thử nghiệm:

Hình 3.1: Chương trình cài đặt thử nghiệm

Chƣơng trình cài đặt thử nghiệm đƣợc xây dựng trên ngơn ngữ lập trình C và chạy đƣợc trên hệ điều hành Windows. Chƣơng trình sử dụng giao diện giao tiếp chung cho cả hai quá trình nén và giải nén thơng qua việc lựa chọn các nút đài.

Chƣơng trình bao gồm nhiều tùy chọn khác nhau để thuận lợi cho việc so sánh, đánh giá kết quả nén và giải nén theo các mơ hình khác nhau.

Chƣơng trình bao gồm hai tùy chọn chính sau đây:

 Phƣơng pháp biến đổi sơ bộ:

- Burrows-Wheeler - Move-To-Front - Kết hợp BWT&MTF  Thuật tốn nén - Mã hĩa Huffman - Mã hĩa số học

Sau mỗi quá trình nén và giải nén chƣơng trình đều đƣa ra các thơng tin: Độ lớn file nguồn; Độ lớn file đích; Thời gian thực hiện; Tỷ lệ nén; Hiệu suất nén; Tỷ lệ nguồn / đích.

3.1 Dữ liệu mẫu

Để thực hiện nén dữ liệu theo các mơ hình nén khác nhau, tác giả sử dụng các file tƣơng ứng cĩ đƣợc từ hai bộ sƣu tập Canterbury CorpusCanterbury Corpus l n chứa các kiểu file khác nhau và là các tập file phổ biến nhất cho các tiêu chí nén khơng tổn hao, tất cả đƣợc cung cấp tại http://www.data- compression.info/Corpora/. Mơ tả của các tệp tin đĩ nhƣ sau:

Bảng 3.1: Mơ tả các tệp tin mẫu để thực nghiệm v i The Canterbury Corpus

File Abbrev Category Size

alice29.txt text English text 152089 asyoulik.txt play Shakespeare 125179 cp.html html HTML source 24603

fields.c Csrc C source 11150

grammar.lsp list LISP source 3721 kennedy.xls Excl Excel Spreadsheet 1029744 lcet10.txt tech Technical writing 426754 plrabn12.txt poem Poetry 481861

sum SPRC SPARC Executable 38240 xargs.1 man GNU manual page 4227

Bảng 3.2: Mơ tả các tệp tin mẫu để thực nghiệm v i The Large Corpus

File Abbrev Category Size

E.coli E.coli Complete genome of the E. Coli bacterium 4638690 bible.txt bible The King James version of the bible 4047392 world192.txt world The CIA world fact book 2473400

Ngồi ra, tác giả cịn sử dụng nhiều kiểu file khác nhau thƣờng đƣợc sử dụng trong cơng việc hàng ngày để thử nghiệm.

Bảng 3.3: Mơ tả các tệp tin mẫu để thực nghiệm

TT Tệp tin Kiểu Kích thước

(bytes)

1 File1.docx Microsoft Word Document 28949 2 File2.doc Microsoft Word 97-2003 Document 104448 3 File3.xls Microsoft Excel 97-2003 Worksheet 793573 4 File4.ppt Microsoft PowerPoint 97-2003 Presentation 1075200 5 File5.chm Compiled HTML Help file 65126 6 File6.pdf Adobe Acrobat Document 158395 7 File7.cpp C++ Source File 35945 8 File8.jpg JPEG Image 61365 9 File9.bmp Bitmap Image 1440054 10 File10.exe Application 261,632 11 File11.xlsx Microsoft Excel Worksheet 793573

3.2 Kết quả thực nghiệm

Sau khi xây dựng chƣơng trình, ta tiến hành thực nghiệm đánh giá hiệu suất

Một phần của tài liệu Nén dữ liệu kết hợp với các phương pháp biến đổi sơ bộ dữ liệu (Trang 42)

Tải bản đầy đủ (PDF)

(69 trang)