KMP算法中使用的Failure函数如何工作?

时间:2012-07-01 09:31:02

标签: string algorithm knuth-morris-pratt

我已经尽力阅读了大部分关于此的文献,但仍然没有理解KMP算法中使用的失效函数是如何构建的。我一直指的是大多数人认为优秀的http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=stringSearching教程。但是,我还是不明白。如果你能给我一个简单易懂的解释,我会感激不尽。

2 个答案:

答案 0 :(得分:9)

失败函数实际告诉我们:如果匹配字符串的X个字符,这个字符串的最长后缀是什么,这样它也是搜索字符串的前缀。

你在问它是如何构建的,这种方法很简单。

如果在字符串的末尾添加一个新字符,那就是构建f [x],如果它与位置f [x-1]处的字符匹配,那么f [x]就是f [ X-1] +1。

在其他不匹配的情况下,您会尝试查找越来越小的后缀并检查它们是否匹配。

例如,您有一个单词"accadaccac",您正在构建一个失败函数,而您刚刚添加了字母'c'。假设你正在为最后一个字母'c'建立一个失败函数。

  • 首先检查上一个字母的失败功能,其失败功能为4,因为您可以将后缀"acca"与前缀"acca"匹配,现在添加字母'c',它与前缀'd'后面的字母"acca"不匹配。
  • 所以你回溯到最后一个好的后缀。您现在正在搜索"acca"的后缀,该后缀也是"accadaccac"的前缀,但小于“acca”。这个问题的答案是f [length(“acca”) - 1],或f [3],即f [3] = 1,因为长度为1的后缀(只是字母'a')也是搜索字符串的前缀。
  • 现在你可以尝试'c'与位置1上的角色匹配,瞧,匹配,所以现在你知道f [9] = f [f [8] -1] +1 = 2。

我希望这会对你有所帮助。祝好运! :)

答案 1 :(得分:-2)

http://www.oneous.com/Tutorial-Content.php?id=24

您可以使用本网站的学习资源来了解KMP算法和失败功能。还尝试获取代码并在其上进行一些手动操作示例字符串。但是,了解其工作原理的最佳方法是在基本算法的某些变体上自行编码。我建议你从SPAYJ上的NHAY和PERIOD开始。