Thuật toán cơ bản

Một phần của tài liệu Công nghệ nén tệp thực thi Binary Delta và các ứng dụng trong mạng và truyền dữ liệu máy tính (Trang 28)

Thuật toán bắt đầu từ phía bên trái của xâu đích T, và cố gắng tìm ra tiền tố của T trong S. Nếu không có tiền tố nào của T trong S, ta loại bỏ ký tự đầu tiên của T đi và bắt đầu lạị Nếu có nhiều tiền tố như vậy trong S, ta chọn tiền tố dài nhất và ghi nó như một khối di chuyển. Sau đó, loại bỏ tiền tố tương ứng từ T và sau đó tiếp tục với tiền tố dài nhất trong phần đuôi còn lại của T, và bắt đầu với phần đầu của S. Tiến trình này tiếp tục cho tới khi T hết các ký tự. Khối di chuyển được ghi lại tạo thành

S(T), một tập phủ tối thiểu của khối di chuyển của T đối với S, sẽ được hình thành sau đó. Ví dụ dưới đây chỉ ra các bước trong sự thi hành của thuật toán.

S = u v w u v w x y

T = | z u v w x w u Khối di chuyển dài nhất bắt đầu tại T[0]: none

Trong bước 1, chúng ta tìm kiếm 1 tiền tố của T[0,…,6] trong S[0,….,7], do không có sự phù hợp nào, chúng ta tìm kiếm sự phù hợp của tiền tố T[1,…,6] trong bước tiếp theọ Lần này, chúng ta tìm thấy 2 sự phù hợp, và sẽ chọn sự phù hợp dài nhất, bắt đầu tại S[4]. Trong bước thứ 3, chúng ta tìm kiếm cho tiền tố T[5,..6] trong S[0,…7], và tìm thấy sự phù hợp dài nhất tại S[2], có độ dài 2. Bây giờ, T đã được xét hết và thuật toán kết thúc. Chú ý rằng, trong mỗi bước, chúng ta sẽ bắt đầu tại phần bên trái nhất của S để xem xét tất cả sự phù hợp có thể.

Thuật toán sẽ được mô tả dưới đâỵ Chúng ta giả định rằng, xâu nguồn được lưu trong mảng S[0…m] và xâu đích được lưu trong T[0,…n]. T[q] là ký tự đầu tiên của phần đuôi không tương thích. của T, q được khởi tạo bằng 0.

Thuật toán như sau: q:=0

While q<= n do Begin

L: tìm p và l trong đó (p;q;l) là 1 khối di chuyển lớn nhất. If l>0 then print(p;q;l) q:=q+Max(1,l) End T = z| u v w x w u S = u v w u v w x y Bước 2:

Khối di chuyển dài nhất bắt đầu tại T[1]: (3,1,4)

T = z u v w x | w u S = u v w u v w x y Bước 3:

Thực hiện câu lệnh có nhãn L thì rất đơn giản. Tìm S từ trái sang phải cho tiền tố dài nhất có thể của T[q…n]. Chú ý rằng, việc tìm kiếm có thể kết thúc ngay khi có ít hơn l+1 ký tự còn lại trong S, với l là độ dài lớn nhất của khối di chuyển đã được tìm thấy trong sự lặp lại hiện thờị Tương tự như vậy, sẽ không thể tìm thấy một khối di chuyển dài hơn nếu ký tự cuối cùng T[n] đã được đạt tớị

L:

l:=0; p:=0; pCur:=0

while pCur +1 <= m and q+1<= n do

begin {Determine length of match between S[pCur…] and T[q…]} lCur :=0;

while (pCur + lCur <= m) and (q+lCur <= n) and then (S[pCur + lCur] = T[q + lCur]) do lCur := lCur +1;

if lCur >1 then

begin {new maximum found} l:=lCur; p:=pCur end;

pCur:=pCur +1 End

Thời gian chạy của thuật toán được giới hạn bởi mn, không gian bộ nhớ yêu cầu là m+n. Bây giờ, chúng ta sẽ chỉ ra rằng thuật toán này sẽ tìm ra một S(T). Rõ ràng, tập các khối di chuyển được in ra là một tập phủ, bởi vì mỗi ký tự trong T mà không được chứa trong khối di chuyển nào (không thành công) sẽ được match lại mỗi ký tự trong S. Để thấy rằng tập phủ là tối thiểu, nghiên cứu T bên dưới, với sự match được cung cấp bởi thuật toán của chúng ta biểu thị dưới đâỵ Các xâu con trong các khối di chuyển được gộp lại bởi các dấu “(” và “)”. Các xâu con không được chứa trong các khối di chuyển được biểu thị bởi X chẳng hạn.

…X(….)X(…)(….)X(….)(….)(….)X…

Giả sử có ‟S(T) có ít khối di chuyển hơn tập được tạo ra bởi thuật toán của chúng tạ Rõ ràng là, xâu con được định nghĩa bởi X không thể được chia ra bởi ‟S(T) vì thuật toán của chúng ta không cung cấp 1 tập phủ. Chúng ta vì thế có thể không quan tâm tới tất cả những xâu con không phù hợp(X), và tập trung vào chuỗi các khối di chuyển liền nhaụ

Xem xét các khối di chuyển liên tiếp trong T. Để chứng minh tập phủ được tạo ra bởi thuật toán của chúng ta là tối thiểu, ta cần chứng minh rằng không thể chia tập phủ đó

thành m sự di chuyển (trong đó m<k, k là số sự di chuyển được tạo ra bởi thuật toán của chúng ta). Điều đó chứng tỏ, thuật toán của chúng ta tạo ra một tập phủ với ít sự di chuyển nhất.

Giả sử chúng ta có k 1 khối di chuyển liên tiếp được tạo ra bởi thuật toán của chúng tạ Điều này có nghĩa rằng chúng ta sẽ có k bộ (pi,qi,li), (1  i  k) thoả mãn các điều kiện sau đây:

Ai: 1  i  k T[qi,….,qi + li –1) = S[pi,…,pi+li –1] (*)

Ai: 1  i  k Ap: 0  p  m - li, T[qi,….,qi + li]  S[p,…,p+li] (**) Ai: 1  i < k T[qi + li] = T[q(i+1)] (***)

Điều kiện đầu tiên để định nghĩa một khối di chuyển. Điều kiện thứ hai đảm bảo rằng mỗi khối di chuyển bắt đầu tại T[qi] là cực đạị Điều kiện thứ ba đảm bảo khối di chuyển là liên tục trong T.

Chúng ta cần chỉ ra rằng với bất kỳ k khối di chuyển nào thoả mãn (*) tới (***), bất kỳ tập tương đương nào cũng có ít nhất k khối di chuyển. Với bất kỳ tập k khối di chuyển thoả mãn (*) tới (***), bất kỳ tập phủ của k-1 khối di chuyển đầu tiên và một tiền tố không rỗng của khối di chuyển k có ít nhất k khối di chuyển. Đầu tiên, giả sử k=1. Rõ ràng, chúng ta không thể chia bất kỳ tiền tố không rỗng của 1 khối di chuyển đơn thành ít hơn 1 khối di chuyển bao phủ. Bây giờ, giả định rằng k>1, tập phủ của tất cả k-2 khối di chuyển và bất kỳ tiền tố không rỗng nào của khối di chuyển k-1 sẽ chứa ít nhất k-1 khối di chuyển. Giả sử ngược lại, ta chia tập phủ thành ít hơn k-1 khối di chuyển. Có 2 trường hợp. Trường hợp đầu tiên ta gom khối di chuyển h (trong đó, phpk-1) vào các khối di chuyển khác. Giả sử, ta gom vào khối h-1, điều này mâu thuẫn với (**). Nếu ta gom vào khối h+1, điều này cũng giống với việc ta gom khối h+1 vào đuôi của khối h. Điều này cũng mâu thuẫn với (**). Vậy, với bất kỳ khối h nào, ta cũng không thể gom vào khối ngay trước hoặc ngay sau nó. Do thuộc tính liên tục, ta cũng không thể gom vào các khối khác, ngoài 2 khối trước và sau nó. Trường hợp thứ 2, ta có thể chia khối di chuyển k-1 thành ít nhất 2 sự di chuyển không rỗng (nhìn vào hình dưới đây). (adsbygoogle = window.adsbygoogle || []).push({});

Orig.block move no k-2 k-1 k Orig.set …….) ( ... | … ) (… | …)

‟S(T) covering k-1 …… …) ( …)

Do những lựa chọn nhằm giảm số lượng khối di chuyển xuống dưới k, ta sẽ thực hiện hợp các hậu tố của di chuyển gốc k-1 với một tiền tố không rỗng của di chuyển k. Tương tự như vậy, ta sẽ tạo ra (a) một tập phủ của khối di chuyển gốc k-2 và một tiền tố không rỗng của khối di chuyển k-1; (b) hợp của một hậu tố của di chuyển k-1 và một tiền tố của k; (c) một khối di chuyển khác nếu hậu tố của di chuyển k không rỗng. Theo giả thuyết, chúng ta biết rằng, (a) có ít nhất k-1 di chuyển. Thêm vào đó, (b) tạo ra 1 khối di chuyển nữa, (c) cũng có thể tạo ra một khối di chuyển nữạVà cuối cùng, chúng ta sẽ kết thúc với ít nhất k di chuyển cho tập phủ của k-1 khối di chuyển đầu tiên và bất kỳ tiền tố không rỗng nào của di chuyển k. Vậy, bất kỳ tập tương đương nào của các khối di chuyển được tạo ra bởi thuật toán của chúng ta cũng có ít nhất k thành phần.

Một phần của tài liệu Công nghệ nén tệp thực thi Binary Delta và các ứng dụng trong mạng và truyền dữ liệu máy tính (Trang 28)