我一直在阅读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.
感谢您提供的任何帮助。
答案 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。