Knuth-Morris-Pratt算法中的模式前缀函数计算

时间:2012-03-27 05:44:52

标签: string algorithm substring knuth-morris-pratt

给定模式的前缀函数是否有可能出现类似这样的内容,

0 0 1 2 3 0 1 2 3 4 5 3 4 5 6 7 0 1 2

在4 5之后的上述前缀函数中,是否只有6或0的可能性?如果在4 5之后有可能存在例如3(小于5且大于0)的情况,那么该模式应该如何。

我认为模式只与此类似,

a b a b a b a b c a 
0 0 1 2 3 4 5 6 0 1

感谢。

2 个答案:

答案 0 :(得分:4)

这是一个示例模式,您在6之后有失败链接4:

a b c a b c d a b c a b c a
0 0 0 1 2 3 0 1 2 3 4 5 6 4

答案 1 :(得分:1)

你的具体例子是不可能的。当你从所需的前缀表开始构造一个字符串时,你得到

0 0 1 2 3 0 1 2 3 4 5 3 4 5 6 7 0 1 2
a b a b a c a b a b a
  1. 第一个符号是任意的,比如说
  2. 第二个符号必须与第一个符号不同,或者前缀长度为1
  3. 第三个必须与第一个相同
  4. 第四个必须与第二个相同
  5. 第五名必须与第三名相同
  6. 既不是目前使用的两个符号,也不是前缀长度为1,b为4
  7. 第七个必须是第一个
  8. 必须是第二个
  9. 必须是第三个
  10. 必须是第四个
  11. 必须是第五个
  12. a会给前缀长度为1,b会给4,c会给6,其他一切给0
  13. 表中与长度p前缀对应的条目给出了该前缀的最宽边b的宽度,比如w。下一个条目只能是w+1(如果b是可扩展的),0(如果没有前缀匹配),或者比b的某个边界的宽度多一个。

    因此,如果table[p]包含length-p前缀最宽边框的宽度(table[0] = -1),那么table[p+1]就是1+table[p]之一,{{1 },...,1+table[table[p]]