Thuật toán của Boyer-Moore

Một phần của tài liệu Nghiên cứu phương pháp so sánh xâu xấp xỉ và ứng dụng (Trang 26 - 34)

Ý tƣởng chính của thuật toán: thuật toán thực hiện đối sánh theo mẫu pat để tìm sự xuất hiện trong văn bản T. Mỗi lần đối sánh sẽ dịch chuyển mẫu theo chiều đối sánh trái qua phải, mẫu pat đƣợc đối sánh trong T theo chiều từ phải qua trái ký

Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/

tự đầu tiên nằm phải cùng. Thuật toán đƣợc thực hiện trên ba ý tƣởng chính. Đối sánh theo mẫu theo chiều từ phải qua trái: pat[m], pat[m-1]... pat[2] pat[1] [2], [11], [13].

Kỹ thuật dịch chuyển theo ký tự sai khớp "bad character shift rule": Nhiệm vụ tránh việc so sánh lặp lại các ký tự không thành công [9]. (1)

Kỹ thuật dịch chuyển theo hậu tố tốt "good suffix shift rule": Dịch chuyển các ký tự sánh đúng (suffix) lặp lại cho lần sánh tiếp theo [9]. (2)

Kỹ thuật đối sánh (scan) chuỗi mẫu pat trong văn bản text: Thực hiện scan từ trái qua phải. Thực hiện dịch chuyển pat lần lƣợt từ trái qua phải,khoảng cách thực hiện phụ thuộc vào kỹ thuật (1) hoặc (2).

Ví dụ: Thực hiện scan các chuỗi sau:

Text = "This picture shows a nice view of the park."; Pat = "future".

- Thực hiện tìm vị trí xuất hiện của pat trong text :

1) pat[6]=text[12]=e, 2) pat[5]= text[11]= r, 3) pat[4] = text[10]=u, 4) pat[3] = text[9]= t, 5) pat[2] = u ≠c = text[8] * Dịch chuyển theo "bad character shift rule":

Khi gặp ký tự không sánh khớp thực hiện dịch chuyển pat sang bên phải,

Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/

định j là vị trí của pat trong text, m là độ dài của pat. Thực hiện scan pat và đối sánh với text tại vị trí ký tự thứ i của pat sẽ có pat[i] = a và text[j+i] = b. Do việc thực hiện từ phải cùng qua trái nên tại vị trí i của pat sẽ có chuỗi con pat[i +1..m] =

text[j+i +1 ... m]. Nhớ rằng đang xét ở vị trí i thì pat[i]!= text[j+i]. Nếu b không

xuất hiện trong pat thì thực hiện dịch pat tại vị trí text[i+j].

Trong trƣờng hợp ngƣợc lại thực hiện dịch chuyển pat đến khi nào gặp b đầu tiên (đối sánh lùi các ký tự để gặp b trong pat đầu tiên) trong pat lên vị trí text[i+j]

Dịch chuyển khi xuất hiện mismacth

Có một vấn đề ở đây là từ vị trí pat[1..i] không chứa b, khi đó việc dịch

chuyển có thể bị thất bại. Với trƣờng hợp này sẽ thực hiện theo kỹ thuật xử lý với trƣờng hợp (1) với tên gọi "Preprocess-bad character shift rule" (xử lý trƣớc khi dịch chuyển ký tự sai khớp).  ) (x R      x i pat m i [ ] max

0 Nếu không tìm thấy b Trong trƣờng hợp ngƣợc lại

Hàm R(x) đƣợc sử dụng trong tính quá trình dịch chuyển pat. Với giải thuyết là tại vị trí i có u = pat[i+1..m] = text[j+i+i... j+m]. và pat[i]!= text[i+j]; với text[i+j] = b . Khi đó dịch chuyển sẽ đƣợc tính theo công thức h= max{1,i-R(b)}.

- Nếu bên phải cùng của pat[k] = b với 1<k < i dịch chuyển pat sao cho pat[k] = text[i+j];

Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/ Dịch chuyển theo vị trí sánh đúng.

- Nếu bên phải cùng của tại k và pat [k]= b với k > i thì thực hiện dịch sang phải 1 ký tự.

Dịch chuyển với hậu tố

- Nếu b không xuất hiện trong pat[1.. m-i] thực hiện dịch pat sang bên phải

với độ dịch là i (sang phải i ký tự) và text[i+j+1.. i+j+m].

Dịch chuyển với độ dịch i vị trí

* Dịch chuyển theo "Good character shift rule":

- Giả định chúng ta có pat[i .. m]=text[i+ j .. j+ m] = u và pat[i-1] ≠ text[i+

Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/ Dịch chuyển theo good -suffix shift (adsbygoogle = window.adsbygoogle || []).push({});

- Hậu tố tốt "good -suffix shift" đƣợc lựa chọn với sự xuất hiện chuỗi u với u = text[i+ j .. j+ m] (=pat[i .. m]); u đƣợc nằm bên phải cùng của pat (trong trƣờng

hợp này u chƣa phải là hậu tố của pat). u sẽ đƣợc phân định (preceded) bởi ký tự

khác nằm trong pat[i-1]. Một trƣờng hợp không tốt đó là không cần phải trƣớc các ký tự trong pat[i-1].

Ví dụ:

text: I visited Helsinki by bike and I pedaled a lot. pat: pedaled

pat: pedaled

Muốn thực hiện chuỗi text[7..9]= "ted" sánh với một trong các chuỗi mẫu u="xed" nào đó với x≠l, và thực hiện dịch chuyển chuỗi u sánh khớp với text[7..9].

Trong ví dụ này sử dụng chuỗi u=pat[1..3]=" ped " để thực hiện dịch chuyển pat[1..3] lên thẳng cột đúng với text[7..9].

- Nếu không tồn tại các chuỗi nhƣ ở trên, thao tác dịch chuyển vị trí với độ dài nhấy của chuỗi hậu tố v của text[ i+ j .. j+ m] với việc đối sánh tiền tố của pat.

Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/

Ví dụ:

text: When the phone ranged he was disturbed. pat: disturbed

Trong ví dụ trên chuỗi "xed" trong pat nên trƣờng hợp này text[21] sánh

đúng với pat[d]. Khi đó chuỗi pat đƣợc dịch chuyển sao cho pat[1] chuyển lên cùng vị trí text[21].

text: When the phone ranged he was disturbed. pat: d isturbed

Dịch chuyển khi không có good -suffix shift

text: I travelled by bike, so I pedaled a lot. pat: pedaled

pat: pedaled

Định lý: Khi sử dụng kỹ thuật "good suffix shift rule" có thể không bao giờ

dịch chuyển mẫu xuất hiện lần cuối cùng trong text. * Kỹ thuật tiền xử lý Good suffix shift rule: - Thực hiện đối sánh ký tự thứ [5], [7], [11]: P = p 1 p 2…p m ,T = t 1 t 2…t n

Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/ Preprocessing For a  ∑ Do For j=m downto m-k Do Begin d k[j,a] ← m

Find a character a that it is close to p

j

.

If it is found, we calculate the distance between the

position of the character a and j and insert it into d

k

[j,a].

- Giải thuật tìm kiếm: Thực hiện tìm kiếm các vị trí xuất hiện của P trong T (adsbygoogle = window.adsbygoogle || []).push({});

sao cho độ xấp xỉ nằm trong k–mismatch (k ký tự khác nhau) Algorithm for searching phase

P = p1p2…pm,T = t1t2…tn Searching j=m; While j≦ n+ k Do Begin h=j; i=m; mismatch=0;

While i>0 and mismatch ≦ k Do Begin

d=min(dk[i, th], dk[i-1, th-1]);

If th≠pi Then mismatch=mismatch+1; i= i-1; h= h-1

End of while;

If mismatch ≦ k Then report match at position j; j= j+ d;

End of while End

- Ví dụ mô tả cho thuật toán:

Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/

+ Bƣớc 1: Let k=1, m=4, n=17

+ Bƣớc 2: Chuyển P lên vị trí của T chứa A và thực hiện đối sánh:

+ Bƣớc 3: Thuật toán tìm thấy T[6]=P[3]. Thực hiện chuyển P sao cho T[6]=

G và P[3]=G có vị trí trùng nhau.

Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/

+ Bƣớc 5: Thực hiện giải thuật

+ Bƣớc 6: Thực hiện giải thuật:

Một phần của tài liệu Nghiên cứu phương pháp so sánh xâu xấp xỉ và ứng dụng (Trang 26 - 34)