RK算法分析与详解
1、原理分析
- 利用哈希对主串依次进行求哈希值,并与子串的哈希值进行比较,相同则说明相匹配
- 但是要排除哈希冲突的可能性(通过匹配来验证)
- 其实就是在主串中依次计算字串长度的哈希值并进行比较
2、Java实现
public class RK {
private static int hash(String string , int R ,int K ,int start ,int len){
int hash = 0;
for (int i = start ; i < start + len ; i++){
hash = (R * hash + string.charAt(i) % K);
}
return hash % K;
}
public static boolean match(String t ,String p ,int i){
for (int j = 0 ;j < p.length() ; j++){
if (p.charAt(j) != t.charAt(j+i)){
return false;
}
}
return true;
}
public static int RK(String t, String p){
if (t == null || t.length() == 0 || p.length() == 0 || p == null){
return -1;
}
int hash = hash(p, 26, 31 ,0, p.length());
for (int i = 0; i< t.length(); i++){
if (hash(t,26,31,i,p.length()) == hash && match(t ,p ,i)){
return i;
}
}
return -1;
}
public static void main(String[] args) {
String a = "abc";
String b = "b";
System.out.println(RK(a, b));
}
}
3、测试
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/abbc8fe69b62b81eb550d2528eac392f.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5af477c8496b291147f6eace13a55fac.png)