Sự cải tiến của thuật toá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 32)

Cân nhắc trường hợp khi xâu nguồn S có một vài các ký tự giống nhaụ Giả sử  là kích thước của phần ký tự giống nhau trong S (không tính các khoảng trắng), xấp xỉ bằng m. Trong trường hợp này, một sự cải thiện đáng kể của thuật toán có thể được thực hiện. Trong khi scan 1 lần S, chúng ta sẽ chuẩn bị một index, với mỗi ký tự s trong S, chúng ta liệt kê ra tất cả các vị trí có s trong S. Trong thuật toán, chúng ta thay thế câu lệnh có nhãn F với câu lệnh sau đâỵ Giả sử T[q]=s là ký tự đầu tiên của phần đuôi không phù hợp của T. Tìm kiếm trong danh sách L sự xuất hiện của s trong S bằng cách sử dụng index trên. Nếu danh sách rỗng, không có sự phù hợp nào tìm thấỵ Mặt khác, ta sẽ tìm kiếm khối di chuyển lớn nhất trong số này bắt đầu với các thành phần của L trong S.

Sự thi hành của thuật toán này sẽ như saụ Giả sử độ dài trung bình của một khối di chuyển là l. Vậy, khối di chuyển lớn nhất phải được chọn trong số m/ lựa chọn, mỗi lựa chọn sẽ tốn không nhiều hơn l+1 phép so sánh. Vậy, thời gian chạy của thuật toán là O(l*(m/alpha)*(n/l))=O(mn/). Nếu m  , chúng ta đạt được một thuật toán tương đối tốt.

Các đoạn text hoặc các bài văn thì thường có các dòng lặp lạị Trong trường hợp đó, chỉ các dòng lặp lại nên được đặt rỗng hoặc bao gồm các dấu ngoặc đơn giống như begin và end; trong các trường hợp có sự lặp lại khác, chúng ta sẽ viết một chương trình con. Trong trường hợp văn xuôi, chỉ các dòng lặp lại nên được đặt rỗng hoặc chứa các lệnh khuôn mẫụ Để áp dụng thuật toán của chúng ta đối với đoạn text hoặc văn xuôi, cần phải chọn các dòng thích hợp giống như các ký tự nguyên tử. Để tăng

tốc sự so sánh, chương trình nên sử dụng các mã băm cho các dòng text hơn là thực hiện các phép so sánh từng ký tự.

Chúng ta thực hiện một chương trình kết hợp chặt chẽ với các ý tưởng này, được gọi là bdiff, và so sánh nó với diff (diff sử dụng thuật toán LCS). Chúng ta thực hiện cả hai chương trình trên 1400 cặp filẹ Mỗi cặp bao gồm 2 sự xem lại text một cách liên tiếp. Hệ thống này lưu rất nhiều các file dữ liệu khác nhaụ Hầu hết tất cả các file mẫu chứa các chương trình text. Chúng ta theo dõi diff và bdiff thi hành với tốc độ giống nhau, nhưng bdiff sẽ cung cấp delta chỉ nhỏ hơn khoảng 7% (trung bình). Nhìn bề ngoài, các khối di chuyển và các dòng trùng nhau trong các chương trình text thì thường không đủ để duy trì không gian cần thiết trên thuật toán LCS. Chúng ta mong muốn những tình huống có lợi hơn cho các khối di chuyển các ứng dụng khác đã được nói tới trong phần giới thiệụ

Một sự cải tiến khác giúp tăng tốc thuật toán thậm chí nếu xâu nguồn chứa rất nhiều ký tự trùng nhaụ Sự cải tiến liên quan tới sự thích nghi của thuật toán Knuth-Moris- Pratt [8], nó cho phép một khuôn mẫu có độ dài l được tìm thấy trong 1 xâu có độ dài m trong O(m+1) bước. Vậy, nếu S có độ dài m, T có độ dài n, và khối di chuyển trung bình có độ dài l, thuật toán của chúng ta nên thao tác O((m+1)*(n/l))=O(mn/l) bước. Chú ý rằng tỉ số m/l biểu thị sự khác nhau của S và T, và thời gian chạy của thuật toán sẽ tương ứng với tỉ số đó. Cũng chú ý rằng tỉ số đó độc lập với các xâu chung trong T và S.

Một thành phần quan trọng trong thuật toán Knuth-Moris-Pratt là một mảng phụ N, nó chỉ ra sau 1 mismatch, một phần của mẫu match hay khối di chuyển phải dịch đi bao xạ Mảng N sẽ được tính trước khi có 1 match. Việc tính lại N sẽ đưa ra một vấn đề cho thuật toán. Vì chúng ta không biết được một khối di chuyển sẽ dài bao nhiêu, nên chúng ta sẽ phải tính trước N cho toàn bộ phần đuôi không xử lý của T, mặc dù bình thường chúng ta chỉ sử dụng một phần nhỏ của nó. Không may, N chỉ có thể được tính tăng dần. Những nét chính của thuật toán được chỉ ra trong phần saụ

Giả sử, ký tự không phù hợp tiếp theo là T[q]. Bắt đầu khởi tạo N[q] và áp dụng thuật toán Knuth-Moris-Pratt để tìm ra sự xuất hiện đầu tiên của T[q]. (Chú ý rằng đây là một mẫu có độ dài 1). Nếu mẫu này không thể tìm thấy, sẽ không có khối di chuyển nào trong T[q]. Mặt khác, khi mở rộng mẫu thêm 1, ta sẽ tính phần tử tiếp theo trong N, và áp dụng lại thuật toán Knuth-Moris-Pratt để tìm ra sự xuất hiện đầu tiên của mẫu mở rộng. Bắt đầu tìm kiếm với match trước. Tiếp tục quá trình này, cho tới khi

mẫu đạt tới một độ dài mà tại đó không có sự match nàọ Lúc đó, sự match trước là khối di chuyển cực đạị

Cho rằng khối di chuyển lớn nhất bắt đầu tại T[q] là l. Như vậy, sự phù hợp cuối cùng có độ dài l+1, và lỗị Việc tính tăng dần của N[q,…q+l+1] tại một giá trị tổng sẽ tương ứng với l đảm bảo rằng giá của match trung bình còn lại O(m+l).

Chương trình chi tiết được cho trong phần mục lục. Ý tưởng của việc tính tăng dần cấu trúc dữ liệu bổ sung cũng có thể được dáp dụng với thuật toán Boyer-Moore matching [8], kết quả trung bình sẽ nhanh hơ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 32)