拉賓卡普

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;

這是重新計算模式的雜湊值,首先刪除最左邊的字元,然後從文字中新增新字元。