Thuật toán BM( Boyer Moor)

Một phần của tài liệu TÌM KIẾM MỜ VÀ ỨNG DỤNG TÌM KIẾM THÔNG TIN TRONG CÁC VĂN BẢN NÉN (Trang 31 - 35)

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:

a) 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

b) 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.

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

23

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:

a) 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í.

b) 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 1.3. tính bảng dịch chuyển d2 là của Knuth, có sự sửa đổi của Mehlhorn.

Trong thuật toán 1.3 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 toán 1.3. Tính bảng dịch chuyển d2

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 24 begin for i: = 1 to m do d2i : = 2 *m- i; j := m; k: = m+ 1; while j > 0 do begin fj: = k; while k <= m and Pj Pi do begin d2k:= mind2k, m- j ; k: = fk]; end; j := j - 1; k := k - 1; end; for i: = 1 to k do d2i : = mind2i, m +k - ij: = fk; while k < = m do begin while k <=j do begin d2k := mind2k, j-k + m k := k + 1; end; j: = fj; end; end;

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

25

Thuật toán 1.4. 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; 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+ maxd1Sj, d2i; end; Ghi nhận counter; end;

Độ phức tạp của thuật toán 4, 5

Độ phức tạp thời gian là O(m + n) và độ phức tạp không gian là O(m).

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

26

Một phần của tài liệu TÌM KIẾM MỜ VÀ ỨNG DỤNG TÌM KIẾM THÔNG TIN TRONG CÁC VĂN BẢN NÉN (Trang 31 - 35)

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

(76 trang)