2016-07-17 38 views
0

我的确了解了KMP算法,即为匹配带前缀的后缀存储值,然后在字符串中搜索时不返回的概念,对于模式“abcdabca”前缀数组将为{0, 0,0,0,1,2,3,1} 我知道直到{0,0,0,0,1,2,3,_},然后'd'在第4个位置与'a'不匹配' 最后。然后,如果j!= 0,算法会回到arr [j-1],我可以看到这给了我们正确的结果,但我不明白为什么我们要回到前一个元素[data]理解依据。KMP模式查找算法

我们回去找到匹配的元素或j == 0,我想不出一个办法来理解我们为什么回去。

感谢

+0

了解回溯失配不是一件简单的事情。试试这个例子和更多的例子,手动在纸上找出来。 – FazeL

回答

1

在我自己的理解,我们用故障功能F[i]来代表最长前缀的从零开始的索引是一样的子串S[0...i](为最长的,我指的是最长的后缀比整个子串本身)

从您的OP等,我认为基于1您的实现或教程使用但是这完全取决于执行

请看下面的例子:S = abababcabab

的失败功能会像F = [-1,-1,0,1,2,3,-1,0,1,2,3]

你可以看什么仔细是发生了什么事时,该算法是在完成的时间计算为S' = ababab????和失败的功能F = [-1,-1,0,1,2,3,?,?,?,?,?]

现在,下一个字符是c,则算法将测试它是否可以附加在已知最长的前缀(后缀)abab上以制作更长的前缀。测试失败为前缀ababa!=后缀ababc,但那又如何?

然后该算法将尝试寻找失败的最长前缀(后缀)的最长前缀(后缀),看看怎么样等候一个c会给我们的比赛(如果是的话,那就是答案)。

这意味着该算法将测试abab这是ab最长前缀(后缀),我们可以知道,很快,因为我们知道F(abab) = 3(我们测试追加一个c和失败),我们知道F(F(abab)) = F(3) = 1,这是ab的位置。

同样的事情发生递归,直到你说我们找到一个匹配或根本没有匹配。当匹配失败时,F[]的“跳跃”正在执行此过程:测试下一个潜在最长前缀(后缀),如果失败,则找到下一个前缀...