1.5. Một số thuật toán so mẫu
1.5.3. Thuật toán BM ( Boyer- Moor)
Một tiếp cận phổ biến trong các thuật toán so đơn mẫu là duyệt tuần tự qua tất cả các ký tự trên xâu vào S, mỗi lần một ký tự. Nhƣng trong thuật toán BM, có thể có những bước nhẩy xa trên S được thực hiện, nhờ vậy BM được đánh giá là thuật toán nhanh nhất về thực hành, đây là lựa chọn hiệu quả cho những ứng dụng thông thường như các trình soạn thảo văn bản.
Ý tưởng cơ bản của thuật toán là sử dụng một “Cửa sổ trượt” như sau:
“Cửa sổ” thực ra là một khúc độ dài m trên xâu vào S (m là độ dài của mẫu P) đƣợc đối sánh với mẫu tại một thời điểm nào đó. Mỗi lần đối sánh mẫu P với một cửa sổ trên S bằng cách so sánh từng ký tự từ phải sang trái. Khi gặp ký tự không khớp, cửa sổ trượt sang phải qua một đoạn trên S (tương ứng với việc dịch mẫu P sang phải). Trường hợp tốt nhất khi sự không khớp xảy ra tại vị trí Pm và ký tự không khớp là Sk lại không phải là một ký tự trong mẫu P, lúc đó có thể an toàn trƣợt cửa sổ sang phải qua m vị trí trên S và bắt đầu quá trình tìm kiếm mới bởi việc so sánh Pm và Sk+ m.
Giả sử tại một thời điểm đang xét cửa sổ Sk - m+ 1Sk - m + 2 .... Sk và bắt đầu so sánh Pmvới Sk.
(1) Giả sử Pm Sk có hai khả năng:
Nếu vị trí xuất hiện phải nhất của ký tự Sk trong P là m - g, ta có thể dịch mẫu P sang phải g vị trí sao cho Pm-g dóng thẳng với Sk rồi bắt đầu lại quá trình đối sánh bởi phép so sánh Pm và S k+ g
Nếu ký tự Sk không có mặt trong P, ta có thể dịch mẫu P sang phải m vị trí. Đây là bước dịch chuyển xa nhất có thể mà vẫn không bỏ sót sự xuất hiện nào của mẫu.
(2) Giả sử m - i ký tự cuối của mẫu P đã khớp với m - i ký tự cuối của S(k). Nếu i = 0, ta đã tìm đƣợc một xuất hiện của mẫu P. Ngƣợc lại, nếu i > 0 và Pi Sk -m+i, xét hai khả năng:
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
Nếu vị trí xuất hiện trái nhất của ký tự Sk -m+i trong P là i - g, khi đó mẫu P đƣợc dịch sang phải g vị trí sao cho Pi-g dóng thẳng với Sk-m+i
và sẽ bắt đầu quá trình đối sánh mới, bắt đầu từ Pm so với Sk+g. Nếu Pi-g nằm bên phải của Pi (khi g < 0) thì mẫu P chỉ dịch sang phải 1 vị trí.
Giả sử sufi(P) là một xâu con của Pi+1-gPi+2-g....Pm-gvà Pi-g Pi (nếu có nhiều xuất hiện nhƣ vậy của sufi(P) thì chọn vị trí phải nhất).
Khi đó sẽ dịch mẫu P sang phải một đoạn dài hơn so với trường hợp (2a) sao cho khúc Pi+1-gPi+2-g....Pm-g dóng thẳng với khúc Sk- m+i+1Sk-m+i+2...Sk và bắt đầu quá trình đối sánh mới từ Pm so với Sk+g. Nhƣ vậy, khi Pi Sj, mẫu P sẽ dịch sang phải đi một số vị trí. Thuật toán sử dụng hai bảng d1và d2 để tính toán bước địch chuyển này.
Bảng d1 bao hàm trường hợp (1) và (2a): Với mỗi ký tự c, d1 c là số i lớn nhất sao cho c = Pi hoặc d c = m nếu c không xuất hiện trong mẫu P.
Bảng d2 bao hàm trường hợp (2b): Với mỗi i, 1 i m, d2 i được xác định là: d2 i = min g + m - i| g 1 và (g i hoặc Pi-g Pi) và ((g k hoặc Pk-g
= Pk) với i k m)
Có nhiều cách tính toán bảng d2 được đưa ra. Thuật toán dưới đây tính bảng dịch chuyển d2 là của Knuth, có sự sửa đổi của Mehlhorn. Thuật toán sử dụng hàm f có tính chất f[m] = m+1 và với 1 j < m, f j = min i j < i < m và Pi+1Pi+2....Pm = Pj+1Pj+2....Pm+j-i .
Thuật tính bảng dịch chuyển d2
procedure computed 2();
begin
for i: = 1 to m do d2 i : = 2 *m- i;
j := m; k: = m+ 1;
while j > 0 do
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
begin f j : = k;
while k <= m and Pj Pi do begin
d2 k := min d2k , m- j ; k: = f k];
end;
j := j - 1; k := k - 1;
end;
for i: = 1 to k do d2 i : = min d2 i , m +k - i j: = f k ;
while k < = m do begin
while k <=j do begin
d2k := min d2k , j-k + m k := k + 1;
end;
j: = f j ; end;
end;
Thuật toán BM tìm sự xuất hiện của mẫu P trong xâu vào S
procedure BM();
var i, j: integer;
counter: integer;
begin
j:= m; counter: = 0;
while j <= n do begin
i: = m;
while i >0 and Sj Pi do begin i: = i - 1; j: = j - 1; end;
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
if i: = 0 then
begin Ghi nhận một lần xuất hiện mẫu tại vị trí j + 1;
counter: = counter + 1;
j := j + m + 1;
end;
else j: =j+ max d1 Sj , d2 i ; end;
Ghi nhận counter;
end;
Độ phức tạp của thuật toán: Độ phức tạp thời gian là O(m + n) và độ phức tạp không gian là O(m).