Tôi đã đọc về thuật toán Rabin Karp và tôi cứ tự hỏi không biết vấn đề lớn với việc giữ các giá trị băm lăn của chúng ta giới hạn bởi một giá trị Q là gì?
Tôi đã nghĩ rằng đại diện số nguyên của chúng tôi trên máy tính thông thường là 2 bổ sung, nó thực sự tương đương chính xác như ràng buộc tất cả các hoạt động của chúng tôi trong các băm lăn bằng 2 ^ 31, do đó, nói cách khác, tôi chỉ đơn giản là không quan tâm. Thêm vào đó, chúng ta càng bị ràng buộc hoặc băm nhỏ, chúng ta càng có nhiều va chạm, do đó, một Q lớn hơn sẽ bằng với hiệu suất được cải thiện!
Tôi đã thử mã hóa một triển khai (Java) đơn giản:
public static int rabinKarp(String text, String pattern) {
if (text.length() < pattern.length()) {
return -1;
} else {
int patternHash = 0;
int textHash = 0;
int pow = 1;
// preprocessing the pattern and the first characters of the text string
for (int i = pattern.length()-1; i >= 0; --i) {
patternHash += pattern.charAt(i) * pow;
textHash += text.charAt(i) * pow;
pow *= 10;
}
pow /= 10;
// actual search
if (patternHash == textHash && areEqual(text, 0, pattern)) {
return 0;
} else {
for (int i = 1; i < text.length()-pattern.length()+1; ++i) {
textHash -= text.charAt(i-1)*pow;
textHash *= 10;
textHash += text.charAt(i+pattern.length()-1);
if (textHash == patternHash && areEqual(text, i, pattern)) {
return i;
}
}
return -1;
}
}
}
Từ một số thử nghiệm sơ bộ, giả thuyết của tôi dường như chính xác về mặt thực nghiệm, nhưng tôi chưa thấy nó được viết ở bất cứ đâu, vì vậy tôi không khỏi thắc mắc ..
Tui bỏ lỡ điều gì vậy?