KMP算法(1),对最长前后缀移位原理的理解

KMP算法即是模式字符串自身的匹配。移位数 = 已匹配长度 - 最长前后缀长度

移位应该使最长前缀与最长后缀相重合,若无最长前后缀,直接跳过已匹配区间。

最长后缀前面的区间中没有可能发生匹配通过吗?

如果匹配通过,则说明最长前后缀不正确,显然两者矛盾,因此疑问证伪。

=============================================

(例一)

设一段字符串ABXYAB*****,当匹配到ABXYAB之后出错。

源字符串        *****ABXYAB*****

匹配字符串            ABXYAB*****

其中显见的条件是AB为最长前后缀,此时应直接移位,继续匹配。

源字符串        *****ABXYAB*****

匹配字符串                    ABXYAB*****

以下1-3位的移位,若出现匹配通过,则都与AB为最长前后缀的显见条件相矛盾,因此证伪。

ABXYAB

  ABXYAB        说明A=B=X=Y,最长前后缀为AAAAA

ABXYAB

    ABXYAB      说明A=X,B=Y,最长前后缀为ABAB

ABXYAB

      ABXYAB    说明A=B=X=Y,最长前后缀为AAAAA 

=============================================

(例二)

设一段字符串ABCDE*****,当匹配到ABCDE之后出错。

源字符串        *****ABCDE*****

匹配字符串            ABCDE*****

其中显见的条件是无最长前后缀,此时应直接移位,继续匹配。

源字符串        *****ABCDE*****

匹配字符串                      ABCDE*****

以下1-4位的移位,若出现匹配通过,则都与无最长前后缀的显见条件相矛盾,因此证伪。

ABCDE

  ABCDE            说明A=B=C=D=E,最长前后缀为AAAA

ABCDE

    ABCDE          说明A=C=E,B=D,最长前后缀为ABA

ABCDE

      ABCDE        说明A=D,B=E,最长前后缀为AB 

ABCDE

         ABCDE     说明A=E,最长前后缀为A 








你可能感兴趣的:(算法)