拓展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爲子串長)
拓展KMP詳解+(筆記)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.