KMP算法

1.作用

用於字符串匹配,是一種改進的方法

2.原理

KMP算法的關鍵是根據給定的模式串Pattern,定義一個next數組。next數組包含了模式串本身局部匹配的信息,即保存中間子字符串從字符串開頭匹配的最長公共前綴信息

3.操作過程

假設在模式匹配的進程中,執行S[i]和P[j]的匹配檢查。若S[i]=P[j],則繼續檢查S[i+1]和P[j+1]是否匹配。若S[i]<>P[j],則分成兩種情況:若j=1,則模式串右移一位,檢查S[i+1]和P[1]是否匹配;若1<j<=m,則模式串右移j-next(j)位,即執行j=next[j]操作,檢查S[i]和P[next(j)]是否匹配。重複此過程直到j=m或i=n結束。

4.時間複雜度

O(m+n)

5.代碼實現

//Preprocessing algorithm(計算前綴的函數)
void kmpPreprocess()
{
    int i=0, j=-1;//-1表示沒有找到
    b[i]=j;
    while (i<m)//小於m是因爲循環內先++,後賦值
    {
        while (j>=0 && p[i]!=p[j]) j=b[j];//j能取0是因爲要從第0個字符比較
        i++; j++;
        b[i]=j;
    }
} 
//Searching algorithm(字符串匹配模式搜索函數)
void kmpSearch()
{
    int i=0, j=0;
    while (i<n)
    {
        while (j>=0 && t[i]!=p[j]) j=b[j];//當j爲-1時表示找不到
        i++; j++;
        if (j==m)
        {
            report(i-j);
            j=b[j];
        }
    }
}

6.參考文獻

http://chaoswork.com/blog/2011/06/14/kmp%E7%AE%97%E6%B3%95%E5%B0%8F%E7%BB%93/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章