KMP算法笔记

说实话,目前对于KMP算法还不是了解的特别通透

但是为了先记住它,主要是因为现在没有那么多时间,所以先放在这里,等以后有空再重新编辑一下

参考博客:

https://blog.csdn.net/u012043391/article/details/52815909

http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html

http://blog.csdn.net/guo_love_peng/article/details/6618170

会转载其中一些图片,和内容

首先KMP算法主要是用来减少初始字符串的匹配

举一个很简单的例子

在i=4与j=4时不匹配,传统做法是i回归原位,并右移一位重新开始下一轮的匹配

可以看出,这种方法速度极慢

那么KMP算法来了,其好处就是对于已经可以匹配的解直接跳过,也就是i不用回归原位,而j可以从不匹配的位置重新开始

word is cheap ,show you the example

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

第一个是关于部分匹配值的计算

首先这个东西还是很好理解的

例如你现在要匹配的模式串为:

而前缀就是:去除最后一个所有顺序子集

例:123512

前缀集有:1,12,123,1235,12351

后缀就是:去除第一个所有的顺序子集

23512,3512,512,12,2

所有有公共的元素12,即长度为2

例一个完整的部分匹配集数组:

ababacacba

p[1]=a ,显然没有前后缀,长度为0

p[2]=ab,前缀为a,后缀为b,没有公共元素,长度为0

p[3]=aba,前缀a,ab,后缀ba,a,公共元素a,长度为1

p[4]=abab,前缀a,ab,aba,后缀bab,ab,公共元素ab长度为2

p[5]=ababa,前缀a,ab,aba,abab,后缀baba,aba,ba,a公共元素aba长度3,(注这里还有一个a公共,但是根据定义为最长的)

........

就可以获取一个表

如果出现这种情况

那么我们只需要将下面的匹配表移动=匹配的字符数-部分匹配值====》3-1(最后一个匹配字符为是3,所以为p[3]=1)=2,即向右移动两位

虽然结果依旧是错的,但是看懂才是关键。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

如果使用KMP算法

 

是不是一下省略了大量的计算,虽然目前结果依然不对,但是没关系。

那么其核心就是如何找出next数组

网上找next数组的方法特别多,但是其实比较正宗的就在上面的博客链接里

然后也分为未改进的KMP算法和改进后的KMP算法

首先是改进前的next数组

 未完待续。。。。。

猜你喜欢

转载自www.cnblogs.com/gambler/p/9236001.html
今日推荐