Cách làm việc của chuyển đổi Burrows-Wheeler

Một phần của tài liệu Nén dữ liệu theo kỹ thuật move to front (Trang 37 - 45)

Giả sử BWT mã hóa xâu T gồm n ký tự T[1... n] trên một bảng chữ

cái Σ gồm |Σ| ký tự.

2.1.1.1 Chuyển đổi Burrows-Wheeler thuận

Chuyển đổi thuận về bản chất liên quan đến việc sắp xếp tất cả các phép quay của xâu đầu vào , nó nhóm các ký tự xuất hiện trong các ngữ cảnh tương tự lại với nhau . Hình 2.1a cho thấy các phép quay A sẽ xuất hiện nếu

chuyển đổi được cho T= mississippi là đầu vào, và Hình 2.1b cho thấy kết quả của việc sắp xếp A gọi là As.

Hình 2.1

(a) Mảng A chứa tất cả các phép quay của đầu vào mississippi

(b) As thu được bằng cách sắp xếp A. Cột cuối của As (ký hiệu L ) là đầu ra của BWT

Tuy nhiên, thay vì sử dụng không gian O(n2

) như đã được đề xuất bởi

Hình 2.1, ta có thể tạo ra một mảng R[1. . . n] tham chiếu đến các xâu đã

được quay trong văn bản đầu vào T. Khởi tạo R[i]=i với i 1,n, như được thể hiện trong Hình 2.2a, để biểu diễn danh sách chưa được sắp xếp . Sau đó nó

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

32

được sắp xếp bằng cách sử dụng xâu con bắt đầu tại T[R[i]] như là khóa so

sánh. Hình 2.2b cho thấy kết quả củ a quá trình sắp xếp. Ví dụ, vị trí 11 là xâu được quay lần đầu tiên theo thứ tự từ điển (imiss...), được theo sau bởi vị trí 8 (ippim...) và vị trí 5 (issip...), .... Xâu tham chiếu cuối cùng là R = [11, 8, 5, 2,

1, 10, 9, 7, 4, 6, 3].

Hình 2.2 Mảng R được sử dụng để sắp xếp file mẫu mississippi

Mảng R trực tiếp chỉ đến các ký tự trong T tương ứng với cột đầu tiên

của As (cột F). Cột cuối của As ( cột L) là đầu ra của BWT , và có thể được

biểu thị bằng T[R[i]-1], với i1,n. Trong trường hợp này, văn bản được chuyển đổi là L=pssmipissii. Ta phải truyền một chỉ số a để báo cho bộ giải

mã đó là vị trí L tương ứng với ký tự cuối của văn bản gốc (tức là hàng của As chứa xâu gốc T). Trong trường hợp này chỉ số a = 5.

Với mô tả trên chuyển đổi đã hoàn thành mà chỉ sử dụng không gian

O(n) (với R). Thời gian thực hiện là O(n) để tạo ra các mảng R, cộng với thời

gian cần thiết để sắp xếp . Thông thường việc sắp xếp được đánh giá mất thời gian trung bình là O(nlogn) nếu phương pháp chuẩn như quicksort được sử

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

33

2.1.1.2 Chuyển đổi Burrows-Wheeler nghịch.

Chuyển đổi nghịch là lấy văn bản đã được hoán vị BWT và khôi phục đầu vào gốc T. Chuyển đổi nghịch có phần khó để cài đặt hơn chuyển đổi

thuận, nhưng nó vẫn có thể được thực hiện trong thời gian và không gian

O(n). Thông thường hai mảng chỉ số O(n) sẽ cần thiết, cộng với hai mảng O(|Σ|) để đếm các ký tự trong đầu vào . Có nhiều cách để thực hiện việc giải

mã. Bài bao gốc của Burrows và Wheeler đưa ra đầu ra theo chiều ngư ợc (từ ký tự cuối đến ký tự đầu của xâu gốc ), mặc dù không khó để đưa ra theo thứ tự gốc. Ta sẽ cho thấy làm thế nào sinh ra các cấu trúc dữ liệu theo hai trường hợp đó.

Giả sử xâu mississippi cần được giải mã . Hình 2.3 cho thấy mảng As

với ví dụ này, với các cột F và L được gán nhãn. Rõ ràng As không được lưu trữ trong thực tế , nhưng ta sẽ sử dụng nó trong phần này để minh họa việc giải mã được thực hiện như thế nào. Bộ giải mã có thể xác định F đơn giản

bằng cách sắp xếp L, vì nó chứa chính xác cùng các ký tự chỉ với thứ tự khác nhau. Mỗi cột của As chứa cùng tập hợp các ký tự bởi vì các hàng là tất cả các phép quay của xâu gốc. Trong thực tế, F không cần được lưu trữ, vì nó có thể được tạo ra mặc nhiên bằng cách đếm xem thường mỗi ký tự xuất hiện trong

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

34

Hình 2.3 Mảng As với mississippi. F và L là các cột đầu và cuối tương ứng

Nhìn vào As giúp ta thấy thông tin cần thiết để thực hiện việc giải mã . Chỉ với F và L đã cho, bước quan trọng là xác định ký tự sẽ đến sau một ký tự riêng biệt trong F. Ví dụ, hai hàng kết thúc với p (hàng 1 và 6). Do phép quay, thứ tự của hai hàng đó được xác định bởi các ký tự mà đến sau xuất hiện tương ứng của p trong T (imi. .. và pmi ... tương ứng). Do đó, xuất hiện đầu

tiên của p trong L tương ứng với sự xuất hiện đầu tiên của p trong F, và tương tự như vậy với sự xuất hiện lần thứ hai . Điều này cho phép ta làm việc theo chiều ngược của văn bản : nếu ta chỉ giải mã p thứ hai trong L, thì nó phải

tương ứng với p trong hàng 7 của F. Nhìn vào hàng 7, cột L cho biết rằng p

đứng trước i. Lần lượt, vì đây là i thứ hai trong L, nó phải tương ứng với i thứ hai trong F, đó là trong hàng 2. Tiếp tục xem xét toàn bộ các mảng L và F

theo cách này cho đến khi toàn bộ xâu được giải mã – theo chiều ngược c ủa văn bản.

Sự tương ứng cũng có thể được sử dụng để giải mã xâu theo thứ tự gốc của nó. Ví dụ, nhìn vào p trong L[6], có thể xác định nó được theo sau

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

35

trong L đó là hàng 1. Đó là p được theo sau bởi i,... Cách này đơn giản hơn

với giải mã xâu theo thứ tự ngược lại.

Một cách dễ dàng theo các mối quan hệ trên là số lượng xuất hiện của các ký tự trong F và L. Hình 2.4 cho thấy các cột F và L từ Hình 2.3, nhưng

phải đánh số các xuất hiện mỗi ký tự theo thứ tự từ đầu đến cuối bằng cách sử dụng các chỉ số dưới. Điều này làm cho xâu được giải mã dễ biểu thị. Ví dụ, dòng thứ tư có L[4] = m1, và tương ứng F[4] cho biết nó được theo sau bởi i4. Vì i4 bằng L[11], ký tự tiếp theo có được từ F[11] là s4. Toàn bộ xâu được

giải nén theo thứ tự m1i4s4s2i3s3s1i2p2p1i1.

Hình 2.4 Sử dụng thứ tự ký tự để thực hiện chuyển đổi ngược

Trong thực tế bộ giải mã không bao giờ khôi phục As hoặc F đầy đủ , nhưng mặc nhiên tạo ra các chỉ mục đ ể biểu diễn đủ cấu trúc của nó để giải mã xâu gốc. L được lưu trữ một cách rõ ràng (bộ giải mã chỉ đọc đầu vào và lưu nó trong L), nhưng F mặc nhiên được lưu trữ để tiết kiệm không gian và

cung cấp hiệu quả kiểu thông tin cần thiết trong suốt quá trình giải mã.

Hình 2.5 cho thấy ba mảng phụ trợ rất hữu ích cho việc giải mã. K[c] đơn giản là đếm bao nhiêu lần mỗi ký tự c xuất hiện trong F, điều đó dễ dàng được xác định bằng cách đếm các ký tự trong L. M[c] định vị vị trí đầu tiên

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

36

của ký tự c trong mảng F, vì vậy K cùng với M lưu trữ hiệu quả thông tin

trong F. C[i] lưu trữ số lần ký tự L[i] xuất hiện trong L sớm hơn vị trí i. Ví

dụ, ký tự cuối cùng trong L là i, và i xuất hiện 3 lần trong thành phần sớm hơn của L. Ba mảng đó làm cho nó dễ nghiên cứu toàn bộ đầu vào theo cách ngược.

Hình 2.5 Mảng (As) mặc nhiên được khôi phục để giải mã xâu pssmipissii

Thuật toán 2.1 cho thấy đầu vào (văn bản được chuyển đổi L và bắt

đầu với chỉ số a) được sử dụng để xây dựng ba mảng đó như thế nào, sau đó

được sử dụng để đưa ra văn bản được giải mã Q.

BWT-Decode(L, a) 1 for c ← 1 to |Σ| do 2 K[c] ← 0 3 end for 4 5 for i ← 1 to n do 6 C[i] ← K[L[i]] 7 K[L[i]] ← K[L[i]] + 1

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn 37 8 end for 9 10 sum ← 1 11 for c ← 1 to |Σ| do 12 M[c] ← sum 13 sum ← sum + K[c] 14 end for 15 16 i ← a 17 for j ← n downto 1 do 18 Q[j] ← L[i] 19 i ← C[i] +M[L[i]] 20 end for

Thuật toán 2.1: Phục hồi văn bản gốc theo chiều ngược

BWT theo cách ngược này yêu cầu bốn mảng (L, K, C và M). K và M chỉ chứa |Σ| đầu vào (các ký tự được biểu diễn bằng các số nguyên từ 1 đến |Σ|). L và C chứa n giá trị, và do đó sử dụng không gian O(n). Thông thường

Q sử dụng không gian O(n) để lưu trữ xâu ngược trước khi nó có thể được lưu

trữ theo đúng thứ tự. Thời gian thực hiện thuật toán 2.1 là O(n) + O(|Σ|), vì

công việc chính là trong hai bước chuyển thông qua n tập mục đầu vào – một

để đếm và một để giải mã chúng.

Giá trị C[i] + M[L[i]] là chìa khóa để điều hướng thông qua L để giải

mã xâu gốc, do đó thay vì thực hiện để giải mã ngay lập tức (các dòng 16 đến 20 của thuật toán 2.1), một V mảng được tạo ra để lưu trữ thông tin điều điều hướng, được thể hiện trong thuật toán 2.2. Mảng này có thể sau đó được sử

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

38

dụng với bước ngược thông qua các ký tự gốc. Ký tự L[i] được đứng trước ký tự L[V[i]]. Các giá trị của V với ví dụ này được thể hiện trong Hình 2.6.

Compute-array-V(C,M,L)

1 i ← a

2 for j ← n downto 1 do 3 V [i] ← C[i] +M[L[i]] 4 i ← V [i]

5 end for

Thuật toán 2.2: Tạo ra mảng V cho phép việc giải mã hiệu quả của đầu vào.

Thật là dễ để tạo ra một mảng phụ mà sẽ giải mã văn bản gốc theo chiều xuôi hơn là chiều ngược. Mảng này được gọi là W để xác định vị trí của ký tự trong L mà đến sau ký tự hiện hành , được so sánh với V, mà đưa vị trí đó đến trước. Mảng mới V không cần thiết cho giải mã nhưng nó có thể hữu

ích vì nó bảo tồn truy cấp vào cấu trúc đã được sắp xếp của L . Hình 2.7 cho thấy các giá trị của W.

Hình 2.6 Các mảng phụ trợ V và W có thể được sử dụng để giải mã xâu mẫu

Thuật toán 2.3 cho thấy mảng W có thể được tạo ra như thế nào. Cũng giống như V, mảng W được tạo ra trong thời gian O(n).

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn 39 Compute-array-W(M, L) 1 for i ← 1 to n do 2 W[M[L[i]]] ← i 3 M[L[i]] ← M[L[i]] + 1 4 end for

Thuật toán 2.3: Tạo ra mảng W cho phép để giải mã đầu vào

W sau đó có thể được sử dụng để tạo ra văn bản gốc theo thứ tự đúng

của nó bằng cách sử dụng dãy đơn được thể hiện trong thuật toán 2.4.

Decode-with-array-W(W, L) 1 i ← a 2 for j ← 1 to n do 3 Q[j] ← L[i] 4 i ← W[i] 5 end for

Thuật toán 2.4: Giải mã văn bản gốc theo thứ tự đúng của nó bằng cách sử dụng W

Một phần của tài liệu Nén dữ liệu theo kỹ thuật move to front (Trang 37 - 45)

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

(77 trang)