KMP算法失效函數計算算法筆記

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

KMP算法的關鍵是要計算一個next數組,在這裏有詳細講解:https://www.cnblogs.com/yjiyjige/p/3263858.html

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

輸入:模式串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

 

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