拓展KMP詳解+(筆記)

拓展KMP算法詳解Blog:http://blog.csdn.net/dyx404514/article/details/41831947


我自己的筆記部分:

                                       拓展KMP(筆記)

   拓展KMP是在KMP的基礎上得到的。

         首先有以下幾點:



 樣例表:

   i

  0

  1

  2

   3

   4

   5

   6

   S

  a

  a

  a

   a

   b

   a

   a

   T

  a

  a

  a

   a

   a

 

 

extend

  4

  3

  2

   1

   0

   2

   1

  next

  4

  4

  3

   2

   1

 

 

 


S:長度爲n的母串    T:長度爲m的子串

Extend:

       Extend[i]表示T與S[I,n-1]的最長公共前綴

       Next[i]表示T[I,m-1]與T數組的最長公共前綴



 遞推結論:

由next[1]= 4得出   T[0,3] = T [1,4]     =>     T[0,2] = T[1,3]

由extend[0]= 4 得出  S[0,3] = T[0,3]    =>  S[1,3] = T[1,3]

那麼可以得出   S[1,3] = T[0,2]   

那麼我們在進行匹配時可以轉化爲直接判斷 S[1,3] 與T[0,2] 是否匹配

由 以上 可得出  S[ po, P ] = T[ 0 , P-po]   =>  S[k+1,P] = T[k-po+1,P-po]    len=next[k-po+1]

(注:

其中 po表示得出extend最遠距離初始的下標 ,P表示由extend得出的以匹配的最遠距離的下標, k表示當前下標  )



 更新:

1k+len<P時   =>  extend[k+1]=len

2k+len>=P時  =>  從S[p+1] 和 T[P-k+1]開始匹配,直到失配,得到extend[k+1]+(k+1) 大於P,更新P和po;



拓展KMP複雜度:

O(n+m)    (n爲母串長,m爲子串長)


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