我正在为我的考试而学习,我正在研究Knuth-Morris-Pratt算法。考试的内容是失败表和DFA结构。我了解DFA的构建,但我真的不懂如何制作失败表。
如果我有一个模式的例子" abababc"如何从中构建失败表?解决方案是:
失败表:
0 1 2 3 4 5 6 7
0 0 0 1 2 3 4 0
但我怎么做到的?没有代码只是解释如何获得它是必要的。
答案 0 :(得分:4)
字符串i
的失败表中的单元格s
的值定义如下:取位于s
的{{1}}的子字符串,以及值在单元格中,这个子串的最长的(不是整个字符串)sufix的长度等于它的相同长度的前缀。
我们以你的例子为例,考虑i
的值。长度为6
的子字符串为s
。它有6个后缀:ababab
,babab
,abab
,bab
和ab
,另一方面,它的正确前缀是b
,{{ 1}},ababa
,abab
和aba
。现在很容易看出,等长于相同长度前缀的前缀是ab
和a
。其中较长的是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]
希望它有所帮助!