Thuật toỏn Karp-Rabin

Một phần của tài liệu Bài toán tìm kiếm văn bản sử dụng giải thuật di truyền (Trang 25 - 27)

4. PHƯƠNG PHÁP NGHIấN CỨU

1.2.5. Thuật toỏn Karp-Rabin

Karp-Rabin bài toỏn tỡm kiếm chuỗi khụng khỏc nhiều so với bài toỏn tỡm kiếm chuẩn. Tại đõy một hàm băm được dựng để trỏnh đi sự so sỏnh khụng cần thiết. Thay vỡ phải so sỏnh tất cỏc vị trớ của văn bản, ta chỉ cần so sỏnh những cửa sổ bao gồm những ký tự “cú vẻ giống” mẫu.

Trong thuật toỏn này hàm băm phải thỏa món một số tớnh chất như phải dễ dàng tớnh được trờn chuỗi, và đặc biệt cụng việc tớnh lại phải đơn giản để ớt ảnh hưởng đến thời gian thực hiện của thuật toỏn. Và hàm băm được chọn ở đõy là:

hash(w[i…i+m-1]) = h = (w[i]*dm-1 + w[i+1]*dm-2 + … w[i+m- 1]*d0) mod q

Việc tớnh lại hàm băm sau khi dịch cửa sổ đi một ký tự chỉ đơn gian như sau:

h = ((h – w[i]*dm-1)*d + w[i+m]

Trong bài toỏn này ta cú thể chọn d = 2 để tiện cho việc tớnh toỏn a*2 tương đương a shl 1. Và khụng chỉ thế ta chọn q = MaxLongint khi đú phộp mod q khụng cần thiết phải thực hiện vỡ sự tràn số trong tớnh toỏn chớnh là một phộp mod cú tốc độ rất nhanh.

Việc chuẩn bị trong thuật toỏn Karp-Rabin cú độ phức tạp O(m). Tuy vậy thời gian tỡm kiếm lại tỉ lệ với O(m*n) vỡ cú thể cú nhiều trường hợp hàm băm của chỳng ta bị lừa và khụng phỏt huy tỏc dụng. Nhưng đú chỉ là những trường hợp đặc biệt, thời gian tớnh toỏn của thuật toỏn KR trong thực tế thường tỉ lệ với O(n+m). Hơn nữa thuật toỏn KR cú thể dễ dàng mở rộng cho cỏc mẫu, văn bản dạng 2 chiều, do đú khiến cho nú trở nờn hữu ớch hơn so với cỏc thuật toỏn cũn lại trong việc xử lý ảnh.

procedure KR(const X: string; m: integer;

const Y: string; n: integer);

var

dM, hx, hy: longint; i, j: integer;

begin

{$Q-} { Disable arithmetic overflow checking }

dM := 1; for i := 1 to m - 1 do dM := dM shl 1; hx := 0; hy := 0; for i := 1 to m do begin hx := (hx shl 1) + Ord(X[i]); hy := (hy shl 1) + Ord(Y[i]); end;

j := 1;

while j <= n - m do

begin

if hx = hy then

if IsMatch(X, m, Y, j) then Output(j);

{hàm IsMatch trong phần BruteForce}

hy := ((hy - Ord(Y[j])*dM) shl 1) + Ord(Y[j +

m]); {Rehash}

Inc(j); end;

if hx = hy then

if IsMatch(X, m, Y, j) then Output(j);

end;

Một phần của tài liệu Bài toán tìm kiếm văn bản sử dụng giải thuật di truyền (Trang 25 - 27)