2.3.2.1. Giới thiệu
Thuật tốn Rabin – Karp là thuật tốn đối sánh chuỗi đƣợc tạo bởi Michael O.Rabin và Richard M.Karp vào năm 1987 và nĩ sử dụng hàm băm để tìm kiếm bất kì từ mẫu nào xuất hiện trong văn bản thay vì việc kiểm tra trực tiếp các kí tự trong mẫu.
Một ứng dụng thực tế của Rabin Karp chính là sự phát hiện đạo văn. Với nguồn dữ liệu, Rabin Karp cĩ thể nhanh chĩng tìm kiếm thơng qua các câu từ trong nguồn dữ liệu, bỏ qua các chi tiết nhƣ dấu châm cấu hoặc các trƣờng hợp khác. Bởi vì sự phong phú của các chuỗi tìm kiếm, thuật tốn tìm kiếm chuỗi là khơng thực tế.
2.3.2.2. Tiền xử lý
Thuật tốn thực hiện băm chuỗi kết hợp để đối sánh.
Để đạt đƣợc hiệu quả tốt cho bài tốn đối sánh, chức năng của hàm băm nên cĩ các thuộc tính sau:
Hiệu quả tính tốn.
Phân biệt cao giữa các chuỗi.
Hash(y[j+1 … j+m]) phải dễ dàng tính tốn đƣợc từ hash(y[j… j+m]) và y[j+m]:
Hash(y[j+1…j+m]) = rehash(y[j], y[j+m], hash(y[j… j+m-1])).
Đối với một từ w cĩ độ dài m, hàm hash(w) đƣợc định nghĩa nhƣ sau:
Hash(w[0…m-1]) = (w[0]* 2m-1
+ w[1]*2m-2 +…+w[m-1]*20)mod q (với q là
một số lớn).
Do đĩ, rehash(a,b,h) = ((h-a*2m-1)*2+b) mod q.
Pha tiền xử lý dữ liệu của thuật tốn Karp – Rabin chính là việc tính tốn hàm hash(x).
Nĩ cĩ thể đƣợc thực hiện trong một hằng số khơng gian và O(m) thời gian.
2.3.2.3. Thuật tốn
Trong suốt quá trình thực hiện pha tìm kiếm, thuật tốn cần thực hiện
trùng khớp đƣợc tìm thấy, thuật tốn cần thiết để kiểm tra sự giống nhau giữa x = y[j…j+m-1] kí tự liên tục.
Cấu trúc thuật tốn thể hiện nhƣ sau:
RabinKarp(string T[1…n], P[1…m]) Đầu vào:
Chuỗi văn bản T. Chuỗi mẫu P.
Đầu ra:
Số nguyên, vị trí xuất hiện mẫu.
Định nghĩa các biến: Số nguyên n 0. Số nguyên m 0. n = length[T]. m = length[P]. Hsub:= hash(P[1…m]); For i từ 1 đến n-m+1 If hs = hsub If s[i…i+m-1] = sub Return i Hs: = hash(T[i+1…i+m]) Return not found
2.3.3.Thuật tốn Boyer Moore Horspool
2.3.3.1. Giới thiệu
Thuật tốn Boyer Moore Horspool [5] đƣợc cơng bố bởi R.Nigel
Horspool. Thuật tốn dựa trên nền thuật tốn Boyer – Moore nhƣng lại thực hiện thuật tốn từ trái qua phải, đạt hiệu quả cao hơn đối với thuật tốn Boyer – Moore.
2.3.3.2. Tiền xử lý
Bảng bmBC chính là sự dịch tƣơng ứng với kí tự bên phải cuối cùng của sự đối sánh ngay phía trƣớc.
P : GCAGAGAG
A A C G *
bmBC[] 1 6 2 8
Cách tính tốn bảng bmBC:
Cách tính tốn bắt đầu từ kí tự cuối cùng của mẫu P và di chuyển về phía kí tự đầu tiên. Mỗi lần di chuyển sang trái, nếu gặp kí tự nào thì thêm kí tự và khoảng cách từ kí tự đĩ tới kí tự ngồi cùng bên phải. Tất cả các kí tự khác mà khơng xuất hiện trong mẫu thì đƣợc gán giá trị là chiều dài của chuỗi tìm kiếm.
Thuật tốn của tiền xử lý: Đầu vào :
Chuỗi kí tự mẫu P.
Đầu ra:
Mảng bmBC chứa vị trí dịch của các kí tự tƣơng ứng trong P.
Định nghĩa các biến: Biến nguyên m 0. m length [P] for i = 0 to 255 bmBC[i] = m for i = 0 to ( m-1) bmBC[x[i]] = m-i-1 Thuật tốn
Cấu trúc thuật tốn đƣợc thể hiện nhƣ sau:
BMH-String-Matching(T,P) [5] Đầu vào:
Chuỗi văn bản T Chuỗi mẫu P
Đầu ra: Kiểu biến nguyên (vị trí xuất hiện của P trong T).
Định nghĩa các biến:
Biến nguyên m 0.
Mảng nguyên T,P. prebmBC ()
pos = 0
while (pos <= n-m-1) do j m-1
while (j > 0 và tj+pos = pj )do j j-1
if(j = 0) return (pos + 1) j j + bmbc[Tpos+m]
end of while