KMP(文字照合アルゴリズム)

 


1、第同じ最大長のプレフィックスとサフィックスを見つけます
 
 
 

各サブ文字列パターン文字列

接頭辞

サフィックス

共通の要素の最大長さ

バツ

空の

空の

0

XY

バツ

0

XYX

X、XY

X、YX

1(X)

XYXY

X、XY、XYX

Y、XY、YXY

2(XY)

xyxyy

X、XY、XYX、XYXY

Y、YY、XYY、yxyy

0

xyxyyx

X、XY、XYX、XYXY、xyxyy

X、YX、YYX、XYYX、yxyyx

1(X)

xyxyyxx

X、XY、XYX、XYXY、xyxyy、xyxyyx

X、XX、yxx、YYXX、xyyxx、yxyyxx

1(X)

xyxyyxxy

X、XY、XYX、XYXY、xyxyy、xyxyyx、xyxyyyxx

Y、XY、XXY、yxxy、yyxxy、xyyxxy、yxyyxxy

2(XY)

xyxyyxxyx

X、XY、XYX、XYXY、xyxyy、xyxyyx、xyxyyyxx、xyxyyyxxy

X、YX、XYX、xxyx、yxxyx、yyxxyx、xyyxxyx、yxyyxxyx

3(XYX)

文字列のパターン

バツ

バツ

バツ

バツ

バツ

最大プレフィックス共通の要素

0

0

1

2

0

1

1

2

3


式のデータ構造のヤン需要次のバージョン:

私たちは、主に第二項を見ている、2つのケースがあります。

セットは式または三場合(その他の場合)、J = 1の空、次いで最初の部分である場合(1)セットは、空である場合、次の[1] = 0、J> 1である場合、次[J] = 1。

(2)kの集合が空ではない、我々は取りたい、kのセットが最大値です。

Kは、1つの第二は、その背後にある、1 <K <jは、2つの条件を満たす必要があります。
--------------------------------------------------------
对于前面这个,不用多说,对于后面这个,如果只看形式化的公式,估计比较难理解其意义。通过阮老师的博文(http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html),不难理解,后面这个表达式的意义就是所有前缀与所有后缀中,前缀与后缀相同的情况,那么,这个 k 的取值就是前缀与后缀相等时,字符串的长度加上 1 。
-------------------------------------------------------

先以严老师书上的例子:

求模式串 abaabcac 的 next 数组

当 j=1 时, next[1]=0 ,直接是公式的第一种情况

当 j=2 时,因为第二种情况要保证集合不为空且 1<k<j ,那么, j=2 时,集合为空,所以不符合第二种情况,因此,属于其他情况,即 next[2]=1

当 j=3 时, k 要小于 j ,所以,我们要在模式串找长度小于 j 的前面全部串的前缀与后缀相同时的最大长度,也就是在模式串中找到前两位 ab ,来找他们最长的前缀与后缀及长度,可以发现,他们没有相同的前缀与后缀,因此,长度为 0 ,而 k 等于长度加 1 ,所以 next[3]=1

当 j=4 时,在 aba 中找前缀与后缀的相同时的最大长度,可以求出最大长度Max为 1 ,所以 next[4]=2

当 j=5 时,在 abaa 中找,Max为 1 ,所以 next[5]=2

当 j=6 时,在 abaab 中找,Max为 2 ,所以 next[6]=3

当 j=7 时,在 abaabc 中找,Max为 0 ,所以 next[7]=1

当 j=8 时,在 abaabca 中找,Max为 1 ,所以 next[8]=2

 

之所以要找前缀与后缀,是因为我们在比较的时候,避免做多余的工作,即每次遇到主串和模式串不等时,都把模式串直接从头开始比。
-------------------------------------------------------------------

以模式串为 xyxyyxxyx 为例,求 next

当 j=1 , next[1]=0

当 j=2 , next[2]=1

当 j=3 ,在 xy 中找前缀与后缀,最大长度 max 为 0 , next[3]=1

当 j=4 ,在 xyx 中找, Max 为 1 , next[4]=2

当 j=5 ,在 xyxy 中找, Max 为 2 , next[5]=3

当 j=6 ,在 xyxyy 中找, Max 为 0 , next[6]=1

当 j=7 ,在 xyxyyx 中找, Max 为 1 , next[7]=2

当 j=8 ,在 xyxyyxx 中找, Max 为 1 , next[8]=2

当 j=9 ,在 xyxyyxxy 中找, Max 为 2 , next[9]=3

おすすめ

転載: www.cnblogs.com/wts-home/p/11221142.html