字符串KMP算法

BF算法:

原理:普通模式匹配算法,其实现过程没有任何技巧,就是简单粗暴地拿一个串同另一个串中的字符一一比对,得到最终结果。 
字符串匹配简单方式是第一个字母跟对比字符串的第一个字母对比,
相同就对比第二个字符串,
不相同就整体往后移,以此类推.
这样的查找方式是无效率的.


KMP算法思想:

一个基本事实是,当空格与D不匹配时,你其实知道前面六个字符是"ABCDAB"。
KMP算法的想法是,设法利用这个已知信息,不要把"搜索位置"移回已经比较过的位置,
继续把它向后移,这样就提高了效率。

1.前缀后缀的概念:

前缀就是除了最后一个元素,其余都是前缀
后缀就是除了第一个元素, 其余都是后缀
比如拿这个字符串来说 "ABCDABD"
①元素A的前缀和后缀都是空,共有元素长度 = 0
②元素AB的前缀是A,后缀是B, 共有长度 = 0
       .
	   .
⑤元素ABCDA的前缀是A、AB、ABC、ABCD,后缀是BCDA、CDA、DA、A,供同元素长度 = 1(前缀有一个A, 后缀也有个A)
⑥元素ABCDAB的前缀是A、AB、ABC、ABCD、ABCDA, 后缀是BCDAB、CDAB、DAB、AB、B,共同元素长度 = 2 (前缀有一个AB, 后缀也有个AB)
       .

以上记录转为图片,图片里的‘部分匹配值=前缀和后缀的共同元素’

通过这个图片的部分匹配值以及通过这个公式(移动位数=已匹配的字符数-对应的部分匹配值)
达到字符串匹配的效率。

演示:


指针目前在D的位置,匹配到空格,前面ADCDAB已经匹配,数量为6, ABCDAB的共同元素为2,所以6-2 = 移动步长。

.
.
.

最后匹配为止。

参考:http://www.ruanyifeng.com/blog/2013/05/Knuth–Morris–Pratt_algorithm.html

posted @ 2020-03-10 15:11  hornets  阅读(151)  评论(0)    收藏  举报