數據結構與算法之KMP算法的實現和優化

1、KMP模式匹配算法的實現算法

// 返回字串T在主串S第pos個字符以後的位置
// 若不存在,則返回0

int Index_KMP(String S, String T, int pos){

    int i = pos;
    int j = 1;
    int next[255];

    get_next(T, next);

    while(i <= S[0] && j <= T[0]){
        
        if(0 == j || S[i] == T[j]){
            i++;
            j++;
        }else{
            j = next[j];
        }
    }

    if(j > T[0]){
        return i - T[0];
    }else{
        return 0;
    }
}

2、KMP模式匹配算法的改進與優化數組

     有人發現上面的KMP算法,實際上是由缺陷的。好比咱們的主串 S = "aaaabcde",字串 T = "aaaaax",其中很容易獲得next數組爲012345。優化

      如圖所示,咱們能夠看到,字串 T 在第5個位置就失配了:code

      

      若是按照上述代碼實現的KMP算法的話,在子串 T 在第5個位置失配時,T開始尋找它的next,即從4開始回溯匹配,直到0,開始位置,發現都不匹配,那麼此時主串 S 和子串 T都往前移動一個位置,即主串 S 到了第6個元素的位置,子串 S 也從位置0到了位置1,以下圖所示:blog

      

      咱們就會發現儘管這是按照KMP算法的思路進行匹配的,可是效率仍然不高,由於子串 T 的前5個都是相同的,因此回溯匹配(4,3,2,1與5相等,若是匹配確定也是失配的!)時就會致使效率低下,因此,咱們有必要進行改進,咱們能夠判斷失配位置對應next數組中值的對應的位置的值是否相等(即判斷位置5和位置4是否相等),即只要在next數組的計算過程當中,若是說它的下一個元素跟以前的前綴元素相等的話,它就須要直接回溯到它前綴元素的next的值那裏去,即回溯到它前綴元素next下標所指向的索引!代碼以下:索引

// 返回字串T在主串S第pos個字符以後的位置
// 若不存在,則返回0

int Index_KMP(String S, String T, int pos){

    int i = pos;
    int j = 1;
    int next[255];

    get_next(T, next);

    while(i <= S[0] && j <= T[0]){
        
        if(0 == j || S[i] == T[j]){
            i++;
            j++;

            // 改進優化代碼-------
            if(T[i] != T[j]){
                next[i] = j;
            }else{
                next[i] = next[j];
            }
            // 改進優化代碼-------

        }else{
            j = next[j];
        }
    }

    if(j > T[0]){
        return i - T[0];
    }else{
        return 0;
    }
}

 

本文爲原創文章,若是對你有一點點的幫助,別忘了點贊哦!比心!如需轉載,請註明出處,謝謝!get

相關文章
相關標籤/搜索