拉宾卡普

Rabin-Karp 算法或 Karp-Rabin 算法是一种字符串搜索算法,它使用散列来查找文本中的一组模式字符串中的任何一个。它的平均和最佳情况运行时间是空间 O 中的 O(n + m)( p),但其最坏情况时间是 O(nm),其中 n 是文本的长度,m 是模式的长度。

java 中用于字符串匹配的算法实现

void RabinfindPattern(String text,String pattern){
    /*
    q a prime number
    p hash value for pattern
    t hash value for text
    d is the number of unique characters in input alphabet
    */
    int d=128;
    int q=100;
    int n=text.length();
    int m=pattern.length();
    int t=0,p=0;
    int h=1;
    int i,j;
//hash value calculating function
    for (i=0;i<m-1;i++)
            h = (h*d)%q;
        for (i=0;i<m;i++){
        p = (d*p + pattern.charAt(i))%q;
        t = (d*t + text.charAt(i))%q;
        }
//search for the pattern 
    for(i=0;i<end-m;i++){
        if(p==t){
//if the hash value matches match them character by character
            for(j=0;j<m;j++)
                if(text.charAt(j+i)!=pattern.charAt(j))
                break;
            if(j==m && i>=start)
                System.out.println("Pattern match found at index "+i);            
        }
        if(i<end-m){
            t =(d*(t - text.charAt(i)*h) + text.charAt(i+m))%q;
            if(t<0)
                t=t+q;
        }    
    }                                
}

在计算哈希值时,我们将它除以素数以避免碰撞。在除以素数之后,碰撞的几率会更小,但是仍然有可能两个字符串的哈希值相同,所以当我们得到一个匹配,我们必须逐个字符检查,以确保我们得到一个正确的匹配。

t =(d *(t - text.charAt(i)* h)+ text.charAt(i + m))%q;

这是重新计算模式的哈希值,首先删除最左边的字符,然后从文本中添加新字符。