了解Knuth Morris Pratt(KMP)失效函数

时间:2013-02-06 20:25:39

标签: string algorithm string-matching knuth-morris-pratt

我一直在阅读Wikipedia article about the Knuth-Morris-Pratt algorithm,我对如何在跳转/部分匹配表中找到值感到困惑。

  i  |  0  1  2  3  4  5  6
W[i] |  A  B  C  D  A  B  D
T[i] | -1  0  0  0  0  1  2

如果有人能够更清楚地解释因为句子

的快捷方式规则
  

“让我们说我们发现了一个正确的后缀,它是一个正确的前缀,以W [2]结尾,长度为2(最大可能)”

令人困惑。如果正确的后缀以W [2]结束,那么它的大小是不是3?

另外,我想知道为什么T [4]在没有大小为1的前缀和后缀时不是1.

感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:5)

请注意,失败函数T [i]不使用i作为索引,而是使用长度。因此,T [2]表示由W的前两个字符形成的字符串的最长的适当边界(既是前缀和后缀的字符串)的长度,而不是由字符串结尾的字符串形成的最长的正确边界的长度。 2.这就是为什么T [2]的最大可能值是2而不是3 - 从W的前两个字符形成的子串不能长度大于2。

使用这种解释,也更容易理解为什么T [4]为0而不是1.由W的前四个字符组成的W的子串是ABCD,它没有正确的前缀也是正确的后缀。

希望这有帮助!

答案 1 :(得分:0)

"我们说我们发现了一个正确的后缀,它是一个正确的前缀,以W [2]结尾,长度为2(最大可能)"

好的,长度最多可以是2,这是正确的,这就是为什么...... 一个事实:"正确"前缀不能是整个字符串,同样适用于"正确的"后缀(如适当的子集)

让我们,W [0] = AW [1] = AW [2] = A,即模式是" AAA",所以,(最大长度)正确的前缀可以是" AA" (从左到右)和(最大长度)正确的后缀可以是" AA" (右到左) //是的,前缀和后缀有重叠(中间" A")

因此,该值将是2而不是3,只有前缀不正确才会为3。