1. 程式人生 > >KMP演算法失效函式計算演算法筆記

KMP演算法失效函式計算演算法筆記

KMP演算法是經典的字串匹配演算法,在序列時時間複雜度為線性。KMP演算法的思想很簡單,將參與匹配的模式串部分視為週期串(最短)後接字首串,週期串重複出現次數記為K,週期串長度記為L。當模式串的第j位與正文串第k位比較時(假設模式串首位與正文串第x位比較),如果字元不相同,最簡單的方法是將模式串相對於正文串的位置向後移動一位,即模式串從正文串第x+1位開始匹配。當參與匹配的模式串部分K大於1時,從x+1到x + L開始的匹配都是無意義的,因為如果能夠再次匹配到k這個位置,則證明週期串不是最小的,這與週期串的定義矛盾。因此在模式串的第j位與正文串的第k位匹配失敗後,直接將模式串後移L位,正文串第k+1位開始與模式串j-L位開始比較就可以了,這樣,正文串中的每個字元在演算法中,只參與一次比較,演算法的時間序列時間複雜度為線性。

也有的地方叫做失效函式,今天看書的時候有點看不懂,看完了寫了一點筆記,抄錄上來以便日後查閱

輸入:模式串P[1 : m]
輸出:失效函式F(k), 1 ≤ k ≤ m + 1
Begin
    F(1) = 0
    F(2) = 1                        //F(2) = j - F(1) = 1 - 0 = 1
    k = 2
    j = 1
    while k ≤ m do                  //在所有位置F(k)計算完成之前
        if P(k) = P(j) then         //如圖6.1(2)相等時,k這個位置能與前面匹配上的長度就是j + 1
            j = j + 1
            k + k + 1
            F(k) = j
            endif
        if P(k) ≠ P(j) then         //不相等時,將j移動一個週期串長度(j = F(j)),繼續匹配
                                    //如果一直匹配不到,j最終會變成0,那說明j的週期串加上
                                    //字首串第一個字元,並不是前面出現的一個週期串,因此j要
                                    //從頭再開始匹配
            j = F(j)
            if j = 0 then
                k = k + 1
                j = 1
                F(k) = 1
                endif
            endif
        endif
    endwhile
End