String 了解Knuth-Morris-Pratt(KMP)失效函数
我一直在阅读,对如何在跳转/部分匹配表中找到值感到困惑String 了解Knuth-Morris-Pratt(KMP)失效函数,string,algorithm,string-matching,knuth-morris-pratt,String,Algorithm,String Matching,Knuth Morris Pratt,我一直在阅读,对如何在跳转/部分匹配表中找到值感到困惑 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吗 我还想知道,当前缀和后缀的大小为1:a时,为什么T[4]不是1 谢谢你能提供
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吗
我还想知道,当前缀和后缀的大小为1:a时,为什么T[4]不是1
谢谢你能提供的任何帮助 请注意,故障函数T[i]不使用i作为索引,而是作为长度。因此,T[2]表示由W的前两个字符构成的字符串的最长正确边框(一个既是前缀又是后缀的字符串)的长度,而不是由以字符2结尾的字符串构成的最长正确边框的长度。这就是为什么T[2]的最大可能值是2而不是3——由W的前两个字符组成的子字符串的长度不能大于2 使用这种解释,也更容易理解为什么T[4]是0而不是1。由W的前四个字符组成的W的子字符串是ABCD,它没有合适的前缀,也没有合适的后缀 希望这有帮助 “假设我们发现了一个合适的后缀,它是一个合适的前缀,以W[2]结尾,长度为2(最大可能)” 好的,长度最大可以是2,这是正确的,这就是为什么。。。 有一个事实:“正确”前缀不能是整个字符串,“正确”后缀也是如此(如正确子集) let,W[0]=A W[1]=A W[2]=A,即模式为“AAA”,因此,(最大长度)正确前缀可以是“AA”(从左到右),而(最大长度)正确后缀可以是“AA”(从右到左) //是的,前缀和后缀有重叠(中间的“A”)
因此,值应该是2而不是3,只有在前缀不正确的情况下才应该是3。Ok这很有帮助。你能帮我解释一下捷径规则是怎么运作的吗?@Shaun-你所说的“捷径规则”是什么意思?我对国民党很熟悉,但以前从未听说过这个词。据我所知,它是利用之前的T[I]值来计算当前值的。我想知道是怎么做到的。@Shaun-啊,我明白了。我在这里有自己编写的算法(以及Python源代码):。注释给出了如何从失效函数的旧值计算失效函数的推导。如果你有任何问题,请告诉我!谢谢你的链接!如果我有任何问题,我一定会发帖。