Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 了解Knuth-Morris-Pratt(KMP)失效函数_String_Algorithm_String Matching_Knuth Morris Pratt - Fatal编程技术网

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源代码):。注释给出了如何从失效函数的旧值计算失效函数的推导。如果你有任何问题,请告诉我!谢谢你的链接!如果我有任何问题,我一定会发帖。