在KMP算法的工作是如何使用的故障功能?(How does the Failure function

2019-09-18 21:54发布

我已经尽我所能读这个大多数文献,仍然没有理解有关KMP算法中使用的故障功能是如何构建的东西。 我一直主要提及http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=stringSearching教程,大多数人认为优秀。 但是,我还是没有理解。 我很感激,如果你可以采取的给我就可以了简单易懂的解释疼痛。

Answer 1:

失败函数实际上告诉我们:如果你匹配一个字符串的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 [长度( “ACCA”) - 1],或f [3],其为f [3] = 1时,因为长度为1的后缀(恰好在字母'a'也是一个前缀的搜索字符串。
  • 现在你可以尝试,如果在'c'上的位置1的字符相匹配,瞧,它匹配的,所以现在你知道F [9] = F [F [8] -1] + 1 = 2。

我希望这能帮到您。 祝好运! :)



Answer 2:

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

U可以在这个网站使用的学习资源理解KMP算法和故障功能。 也可尝试采取的代码,并通过手的示例串做一些关于它的运行。 然而,了解其工作的最好的办法是自己编写它的基本算法的一些变化。 我建议ü开始NHAY和周期SPOJ。



文章来源: How does the Failure function used in KMP algorithm work?