KMP算法总结

来源:互联网 发布:网络词鬼鬼什么意思 编辑:程序博客网 时间:2024/06/03 18:40

KMP算法:字符串匹配算法,通过辅助函数跳过不必要的扫描,提高匹配效率。

例如:

从abcdef中找到bcd可以一次性匹配成功

从abbcd中找到bcd:在b时匹配失败 需要向后移动一位重新开始匹配 因为bb相等

从 abcebcdef找到待匹配字符串bcd 时:bc匹配成功,e开始失败,下一轮寻找如果从bc中的c开始匹配就会很浪费时间,因为b≠c,从c开始匹配肯定不成功,哪里匹配失败就从哪里重新开始匹配即可,bce中e开始失败 那么就从e重新开始匹配。

kmp算法就是要告诉我们应该从哪里开始匹配才是最佳搜索方法,避免不必要的匹配过程,为此,专门有前缀函数来帮助我们 当遇到匹配失败的情况时应该后移几位开始新的匹配。

公式:S=Q-L

S:移动位数

Q:已匹配位数

L:既是自身(已匹配的字符串中)真后缀又是自身最长前缀的字符串长度 

(注释L:abcd 的后缀有:abcd、bcd、cd、d;真后缀就是不包含自身的后缀。abcd前缀有:abcd、abc、ab、a)

在上述中bcd匹配abcebcdef时,第一次是匹配成功bc,即Q=2,L=0,∴S=2,由向b后移两位到e重新开始匹配

例2:

在字符串中abcbababaabcbdf匹配

                          ababaca       字符串

Q=5

ababa的真后缀有:baba、aba、ba、a

              前缀有:ababa、abab、aba、ab、a

既是真后缀又是自身最长前缀的字符串是:aba   ∴L=3    S=5-3=2  应该向后移动两位开始下一轮匹配




0 0