5. Bố cục của đề tài
2.1.3. Thuật toỏn Boyer-Moore
Thuật toỏn sẽ tỡm kiếm cỏc ký tự mẫu từ phải sang trỏi từ ký tự cuối cựng. Giả sử trong trường hợp mis-match(hoặc là trường hợp đó tỡm thấy 1 đoạn khớp mẫu), nú sẽ dựng 2 hàm được tớnh toỏn trước để dịch cửa sổ sang bờn phải. Hai hàm dịch chuyển này được gọi là good-suffix shift (cũn được biết với cỏi tờn phộp dịch chuyển khớp) và bad-character shift (phộp dịch chuyển xuất hiện).
Đối với mẫu P [0..m-1] ta dựng 1 biến chỉ số i chạy từ cuối về đầu, đối với chuỗi T [0..n-1] ta dựng 1 biến j để chốt ở phớa đầu.
G/s rằng trong quỏ trỡnh so sỏnh ta gặp 1 mis-match tai vị trớ P i[ ] a của mẫu và [T i j] b trong khi đang thử khớp tại vị trớ j.
17
Hỡnh 2.1: Mis-match trong khi đang so sỏnh tại vị trớ j
Khi đú, [P i 1...m 1] T j[ i 1...j m 1] u và [ ]P i T i[ j] . Bõy giờ ta đi xột xem đối với từng trường hợp, 2 hàm trờn sẽ thực hiện việc dịch chuyển như thế nào:
Phộp dịch chuyển good-suffix shift sẽ dịch cửa sổ sang bờn phải cho đến khi gặp 1 ký tự khỏc với P i[ ] trong trường hợp đoạn u lại xuất hiện trong
P.
Hỡnh 2.2: Good-suffix shift, trường hợp u lại xuất hiện trong P
Nếu đoạn u khụng xuất hiện lại trong P, mà chỉ cú 1 phần cuối (suffix) của u khớp với phần đầu (prefix) của P,thỡ ta sẽ dịch 1 đoạn sao cho phần suffix dài nhấtv của [T j i 1...j m 1] khớp với prefix của P.
Hỡnh 2.3: Good-suffix shift, trường hợp chỉ suffix của u xuất hiện trong P
Phộp dịch chuyển bad-character shift sẽ khớp kớ tự [T i j] với 1 ký tự (bờn phải nhất) trong đoạn P[0...m 2] (cỏc bạn thử nghĩ xem tại sao khụng phải là m-1)
18
Hỡnh 2.4: Dịch để ký tự b ăn khớp với văn bản
Nếu [T i j] khụng xuất hiện trong P, ta thấy ngay rằng khụng cú xuất hiện nào của P trong T mà lại chứa [T i j], do đú ta cú thể đặt cửa sổ ngay sau [T i j], tức là [T i j 1].
Hỡnh 2.5: Dịch khi b khụng xuất hiện trong P