Thuật toán BoyerMoore được đưa ra năm 1977 để kiểm tra, tìm kiếm xâu cho một văn bản T1,2,…,n có chiều dài n với mỗi Ti là một kí tự trong bảng chữ cái (alphabet) với kích thước là 256 ký tự khác nhau. và một xâu mẫu P1,2,…,m có chiều dài m (m≤n). Tìm (các) vị trí xuất hiện của xâu P (như là một xâu liên con liên tục) trong văn bản T. Như vậy, thuật toán BoyerMoore sẽ đối sánh T và P theo chiều từ phải sang trái của P. Bằng cách áp dụng thêm luật kí tự tồi (bad character rule) và luật hậu tố tốt.
MỤC LỤC MỤC LỤC I – GIỚI THIỆU II- THUẬT TOÁN BOYER MOORE III- SỐ PHÉP GÁN VÀ SO SÁNH IV – ĐỘ PHỨC TẠP CỦA THUẬT TOÁN 10 V- KẾT LUẬN: 13 VI – TÀI LIỆU THAM KHẢO 13 I – GIỚI THIỆU Thuật toán Boyer-Moore đưa năm 1977 để kiểm tra, tìm kiếm xâu cho văn T[1,2,…,n] có chiều dài n với T[i] kí tự bảng chữ (alphabet) với kích thước 256 ký tự khác xâu mẫu P[1,2,…,m] có chiều dài m (m≤n) Tìm (các) vị trí xuất xâu P (như xâu liên liên tục) văn T Như vậy, thuật toán Boyer-Moore đối sánh T P theo chiều từ phải sang trái P Bằng cách áp dụng thêm luật kí tự tồi (bad character rule) luật hậu tố tốt II- THUẬT TỐN BOYER MOORE Luật kí tự tồi: Xuất khác mẫu P văn T: b = T [i+ j]# P[ i]=, ta dịch cho có ký tự giống b mẫu khớp vào vị trí đó, có nhiều vị trí xuất b mẫu ta chọn vị trí bên phải Nếu khơng có ký tự b mẫu ta dịch cho ký tự trái mẫu vào vị trí sau ký tự T [i+ j]= b để đảm bảo ăn khớp Hai hướng tiếp cận tạo giá trị dịch chuyển khác nhau, từ lựa chọn giá trị lớn làm giá trị dịch chuyển Trước hết xem xét ví dụ sau để hiểu luật T=FINDIFAHAYXEACKNEXDLET=FINDIFAHAYXEACKNEXDLE P=NEXDLEP Tại bước (i=1)so sánh T[1,2,…,6] với P[1,2,…,6] ta thấy T[6]≠P[6] (chú ý ta so sánh từ phải sang trái P) Do T[6]∉P, ta dịch P lên đơn vị bắt đầu so sánh T[7,8,…,12] với P[1,2, …,6] Tại bước ta gặp vị trí khơng khớp T[11]≠P[5], T[11]=P[3], ta dịch P lên đơn vị T[11] thẳng hàng với P[3] tiếp tục so sánh T[9, …,14] với P[1,2,…,6] Tại bước này, T[14]≠P[6] T[14]∉P, ta dịch P lên đơn vị so sánh T[15,…,20] với P[1,2,…,6]] Tiếp tục bước hình vẽ đây, cuối ta tìm mẫu P vị trí i=16 F I N D I 10 11 12 13 14 15 16 17 18 19 20 21 F A H A Y X E A C K N E X D L E N E X D L E N E X D L E N E X D L E N E X D L E N E X D L E Hình – Quá trình so khớp mẫu P=”NEXDLE” thuật tốn Boyer-Moore Luật kí tự tồi: Dịch P lên số x đơn vị cho kí tự tồi T[k] khớp với kí tự P[s] kí tự xuất gần với P[m] (s lớn nhất) Nếu s>js>j khơng tồn kí tự P[s] ta dịch P lên Để thực thi luật kí tự tồi, với kí tự ∈Σ, gọi R[σ] vị trí xuất kí tự σgần với P[m] Nếu σ∉P, R[σ]=0 Theo quy luật kí tự tồi, bước dịch P đoạn là: max(1,j−R[T[k]]) Index x x x x x x Hình – Quá trình dịch P lên số x đơn vị Thủ tục thuật giả mã thuật toán BM sử dụng luật kí tự tồi sau: int BMmatcher(int n, int m){ badCharBackup(m); int i = 1, j = 0, p = 0, skip = 0; while(i = && skip == 0){ if(T[i+j-1] != P[j]){ p = T[i+j-1]-96; skip = max(1, j - R[p]); } j ; } if(skip == 0) { return i; } i = i + skip; } return -1; } void badCharBackup(int m){ int i = 0; memset(R, 0, sizeof(R)); for(i = 1; i 0) cho tiền tố P khớp với hậu tố P T Trong trường hợp dịch vậy, dịch P lên m đơn vị Xét ví dụ sau: T[1,2,…,30]= C G T G C C T A C T T A C T T A C T T A C T T A C G C G A A P[1,2,…,9]= C T T A C T T A C so sánh T với P, nhận thấy Tsub={TAC}=T[7,8,9], tìm Tsub=(TAC)=P[3,4,5], ta dịch đơn vị để khớp với Tsub Hình 3: so sánh P với T theo luật Good suffix rule Thủ tục thuật giả mã thuật toán BM sử dụng luật kí tự tồi sau: int fastfastBMmatcher(int n, int m){ computeLL(m, LL, Zbar); computeSL(m, SL, Zbar); while(i = && skip == 0){ if(T[i+j-1] != P[j]){ p = T[i+j-1]-96; skip = max(1, j - R[p]); if(j!=m){ if(LL[j+1] !=0){ skip = max(skip, m - LL[j+1]); } else { skip = max(skip, m - SL[j+1]); } } } j ; } if(skip == 0) return i; i = i + skip; } return -1; } void computeLL(int m, int *LL, int *Zbar){ int i = 0, j = 0; char Prev[m+1]; int Zrev[m+1]; for(i = m; i >= 1; i ){ Prev[m-i+1] = P[i]; } compute_Z_function(Prev, Zrev, m); for(i = 1; i