CHƯƠNG 2: TÌM HIỂU MỘT SỐ THUẬT TOÁN
2.3 Thuật toán của Boyer-Moore
Ý 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, việc sánh khớp lại đƣợc thực hiện lại từ đầu cho vị trí mới của pat trong text. Giả
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 maxim0pat[i]x 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+
j-1].
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
- 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.
Dịch chuyển hậu tố với i+ j .. j+ m
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 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:
T="TTAACGTÂTGCAGCTA" và P="AGCT"
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.
+ Bước 4: Tìm thấy trùng nhau ở vi trí T[9]= P[1] = A
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: