Knuth-Morris-Pratt失败表

时间:2014-04-24 05:59:59

标签: algorithm knuth-morris-pratt

我正在为我的考试而学习,我正在研究Knuth-Morris-Pratt算法。考试的内容是失败表和DFA结构。我了解DFA的构建,但我真的不懂如何制作失败表。

如果我有一个模式的例子" abababc"如何从中构建失败表?解决方案是:

失败表:

0 1 2 3 4 5 6 7

0 0 0 1 2 3 4 0

但我怎么做到的?没有代码只是解释如何获得它是必要的。

2 个答案:

答案 0 :(得分:4)

字符串i的失败表中的单元格s的值定义如下:取位于s的{​​{1}}的子字符串,以及值在单元格中,这个子串的最长的(不是整个字符串)sufix的长度等于它的相同长度的前缀。

我们以你的例子为例,考虑i的值。长度为6的子字符串为s。它有6个后缀:abababbababababbabab,另一方面,它的正确前缀是b,{{ 1}},ababaabababa。现在很容易看出,等长于相同长度前缀的前缀是aba。其中较长的是abab,因此单元格6中的值是其长度 - ab

答案 1 :(得分:0)

模式P = {abababc} P [0] ='a'。 P [1] ='b'。 P [2] ='a'。 P [3] ='b'。 P [4] ='a'。 P [5] ='b'。 P [6] ='c'。

失败表的动机是识别最大可能的移位(这样我们不会错过任何模式匹配,但也不会进行不必要的比较),如果模式字符串的第一个“i”字符匹配并且在第i + 1个角色找到了休息。

如果模式的第一个i字符与文本匹配,则“失败表”中的数字表示移位后仍有多少字符仍然匹配。

让FailTable为FT []。

FT [1] - 'a'与文字匹配。在'b'处找到休息点(P [1])。我们是否有一个'a'的正确后缀,它匹配'a'的正确前缀?答案是否定的。因此,在移位后仍然继续匹配的字符串的长度为0.因此FT [1] = 0。

FT [2] - 'ab'与文字匹配。在'a'处发现中断(P [2])。我们有一个'ab'的正确后缀,它匹配'ab'的正确前缀吗?答案是否定的。因此,在移位后仍然继续匹配的字符串的长度为0.因此FT [2] = 0。

FT [3] - 'aba'与文字匹配。在'b'处发现中断(P [3])。我们有一个'aba'的正确后缀,它匹配'aba'的正确前缀吗? Ans是YES('a')。因此,在移位后仍然继续匹配的字符串的长度为1.因此FT [3] = 1。

FT [4] - 'abab'与文字匹配。在'a'处发现中断(P [4])。我们是否有一个'abab'的正确后缀,它匹配'abab'的正确前缀? Ans是YES('ab')。因此,在移位后仍然继续匹配的字符串的长度为2.因此FT [4] = 2。

FT [5] - 'ababa'与文字匹配。在'b'处找到中断(P [5])。我们有一个'ababa'的正确后缀,它与'ababa'的正确前缀相匹配吗? Ans是YES('aba')。因此,在班次之后仍然继续匹配的字符串的长度为3.因此FT [5] = 3。

FT [6] - 'ababab'与文字匹配。在'a'处找到休息(P [6])。我们有一个'ababab'的正确后缀,它与'ababab'的正确前缀相匹配吗?答案是肯定的('abab')。因此,在移位后仍然继续匹配的字符串的长度为4.因此FT [6] = 4。

FT [7] - 'abababc'与文字匹配。根本找不到休息,模式与文本匹配。我们有一个'abababc'的正确后缀,它与'abababc'的正确前缀相匹配吗?答案是否定的。因此,在移位后仍然继续匹配的字符串的长度为0.因此FT [7] = 0。

因此最终的数组是FT = [0,0,1,2,3,4,0]

希望它有所帮助!