字符串KMP算法

Posted hornets

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串KMP算法相关的知识,希望对你有一定的参考价值。

起因:

字符串匹配简单方式是第一个字母跟对比字符串的第一个字母对比,
相同就对比第二个字符串,
不相同就整体往后移,以此类推.
这样的查找方式是无效率的.

技术图片
技术图片

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%E2%80%93Morris%E2%80%93Pratt_algorithm.html

以上是关于字符串KMP算法的主要内容,如果未能解决你的问题,请参考以下文章

KMP算法及Python代码

KMP算法

字符串匹配(KMP 算法 含代码)

图解KMP算法原理及其代码分析

KMP算法的理解和代码实现

数据结构—串KMP模式匹配算法