字符串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
浙公网安备 33010602011771号