首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Knuth-Morris-Pratt算法角例

Knuth-Morris-Pratt算法角例
EN

Stack Overflow用户
提问于 2013-12-08 23:28:35
回答 1查看 317关注 0票数 1

在Knuth Pratt算法中,当“子串”字是一个序列的字母时,例如。“AAAAAAAA.”,故障表如下:"-1,0,1,2,3,4,5,.“。

这意味着,如果测试类似于"AAAAAAAB“,当我们到达" B”时,我们将返回X字符并开始重新匹配,尽管我们知道我们应该在B之后开始。

我是不是遗漏了什么?

编辑(使示例具体化):

假设测试是: AAAAAAAABAAAAAAAAA,即(8 As,B,9 As),查找的单词是AAAAAAAAA,也就是(9 As)。

失败表将是:-1,0,1,2,3,4,5,6,7。

在某个时刻,它将是m= 0,i= 8,这将失败,因此m将变成m=m+i- T8 =0+8-7 => m=1,而i将是T8 = 7。

这将再次失败,所以现在我们有m= 2,i= 6,然后m= 3,i= 7,等等。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-08 23:49:53

您将返回length(needle)字符,但只会在failure表给出的偏移量处开始匹配。在这种情况下,如果B上有7A而您失败了,T[7]会说“跳过7个字符”,所以您可以检查needle[7]haystack[failed-length(needle)+7] (其中失败是大海捞针中B与A比较的索引)。因此,它将以线性时间运行,总是跳过你已经匹配的7A中的6个比较。一个更聪明的算法可能会跳过更多,但只有更多的常量,因为它不能比线性更好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20460601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档