Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (98.25 KB, 2 trang )
Thuật toán Rabin-Karp
Thuật toán Rabin-Karp là một trong những phương pháp tìm kiếm chuỗi. Ý tưởng là chúng ta sẽ
khai thác một vùng nhớ lớn bằng cách xem mỗi đoạn M-ký tự có thể có của văn bản như là một
khoá (key) trong một bảng băm chuẩn. Nhưng không cần thiết phải giữ một bảng băm tổng thể,
vì bài toán được cài đặt sao cho chỉ một khoá là đang được tìm kiếm; việc mà ta cần làm là đi
tính hàm băm cho M ký tự từ văn bản vì nó chỉ đơn giản là kiểm tra xem chúng có bằng với mẫu
hay không. Với hàm băm: h(k) = k mod q, ở đây q (kích thước bảng) là một số nguyên tố lớn.
Trong trường hợp này, không có gì được chứa trong bảng băm, vì vậy q có thể được cho giá trị
rất lớn.
Phương pháp này dựa trên việc tính hàm băm cho vị trí i trong văn bản, cho trước giá trị tại
ví trí i-1 của nó, và suy ra hoàn toàn trực tiếp từ công thức toán học. Giả sử rằng ta dịch M
ký tự thành số bằng cách nén chúng lại với nhau trong một từ (word) của máy, mà ta xem
như một số nguyên. Điều này ứng với việc ghi các ký tự như các con số trong một hệ
thóng cơ số d, ở đây d là số ký tự có thể có. Vì vậy số ứng với a[i..i+M-1] là
x = a[i]d
M-1
+ a[i+1]d
M-2
+ …+ a[i+M-1]
Và có thể giả sử rằng ta biết giá trị của h(x) = x mod q. Nhưng dịch (shift) một vị trí sang
phải trong văn bản tương ứng với việc thay x bởi (x - a[i]d
M-1
)d + a[i+M].
Một tính chất cơ bản của phép toán mod là ta có thể thực hiện nó bất kỳ lúc nào trong các
phép toán này và vẫn nhận được cùng câu trả lời. Cách khác, nếu ta lấy phần dư khi chia
cho q sau mỗi một phép toán số học (để giữ cho các số mà ta đang gặp là nhỏ), thì ta sẽ
nhận được cùng câu trả lời như thể ta đã thực hiện tất cả các phép toán học, sau đó lầy
phần dư khi chia cho q.
Điều này dẫn tới một thuật toán đối sánh mẫu rất đơn giản được cài đặt dưới đây:
fuction rksearch: integer;