码迷,mamicode.com
首页 > 编程语言 > 详细

字符串KMP算法

时间:2020-03-10 15:55:55      阅读:56      评论:0      收藏:0      [点我收藏+]

标签:技术   记录   演示   算法   code   算法思想   mamicode   信息   前缀和   

起因:

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

技术图片
技术图片

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算法

标签:技术   记录   演示   算法   code   算法思想   mamicode   信息   前缀和   

原文地址:https://www.cnblogs.com/hornets/p/12455827.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!