KMP算法

KMP算法是一种改进的字符串匹配算法

他是利用匹配失败的信息,尽量减少匹配次数,达到快速匹配的目的。

需要理解的概念
前缀: 指除了最后一个字符以外,一个字符串的全部头部组合:例如 ‘ABCDEFG’他的前缀组合就有:‘ABCDEF’,'ABCDE','ABCD','ABC','AB','A'


后缀:指除了第一个字符以外,一个字符串的全部尾部组合:例如 ‘ABCD’ 他的后缀组合就有'BCD','CD','D'

部分匹配值: 就是前缀与后缀的最长的共有元素的长度。
例如 ‘ABCDABD’

A的前缀与后缀全是空 共有元素的长度为0
AB的前缀A后缀是B 共有元素的长度为0
ABC的前缀A AB与后缀是BC B 共有元素的长度为0
ABCD的前缀A AB ABC与后缀 BCD CD D 共有元素的长度为0
ABCDA的前缀 A AB ABC ABCD与后缀 BCDA CDA DA A 共有元素A的长度为1
ABCDAB的前缀A AB ABC ABCD ABCD ABCDA与后缀 BCDAB 共有元素的长度为2
ABCDABD的前缀‘A’,'AB','ABC','ABCD','ABCDA','ABCDAB'与后缀 BCDABD CDABD DABD ABD BD D 共有元素的长度为0

那么可以得到一个匹配表
搜索词 A B C D A B D
部分匹配值 0 0 0 0 1 2 0

比如

BBC ABCDAB ABCDABCDABDE

ABCDABD
逐位比较,
第一次 当A与空格不匹配 移动6-2移动4位 其中6是前面匹配的数目 2是不匹配的D的前面一位B的部分匹配值2

 

BBC ABCDAB ABCDABCDABDE

ABCDABD
第二次 当空格与C不匹配 移动2-0移动2位 2是前面匹配的个数 0是前面B的部分匹配值0

 


BBC ABCDAB ABCDABCDABDE

ABCDABD
第三次 当C与D不匹配 移动6-2=4

 

BBC ABCDAB ABCDABCDABDE

ABCDABD
得到匹配


具体就这样,感觉有点鸡助,emmm,但是的确匹配效率高了

posted @ 2019-07-03 11:20  小徐很优秀  阅读(143)  评论(0编辑  收藏  举报