KMP算法的简易理解

个人心得:


刚学数据结构,遇到kmp感觉有点难度,费了几个小时弄懂了大概。

首先我们来看

这是第一位不匹配的状态:图1
请添加图片描述
主串移到下一位,模式串不变

第二位不匹配的情况:图2
请添加图片描述
主串不变,模式串回溯到第一位

第三位不匹配的情况:图3
请添加图片描述
主串不变,模式串回溯到第二位

第四位不匹配的情况:图4

在这里插入图片描述
主串不变,模式串回溯到第三位

可以观察到,除了第一位不匹配的时候需要移动主串,其余位不匹配都只移动模式串。

那么怎样知道回溯到第几位呢?

首先我们看图3:
在这里插入图片描述
模式串箭头左边的公共前后缀是“a”,长度(记为L)是1

再看图4:在这里插入图片描述
模式串箭头左边的公共前后缀是“aa”,长度(记为L)是2

我们可以注意到二者下一次匹配的箭头左边的长度就是L,而匹配的就是第(L+1)位。
箭头左边的看似我们没有匹配就跳过了,实际上它就是公共前后缀,事实已经匹配。

那么当没有公共前后缀或者说公共前后缀就是箭头左边的一整个字串,该怎么办呢?

看图5:
请添加图片描述

也是跟我们上面说的一样,并且等同于图2:
在这里插入图片描述
我自己看的时候一直看不出第一位和第二位不匹配有什么区别,现在终于知道了:第一位不匹配移动主串,第二位不匹配移动模式串。

到这我们也可以发现其实移动多少跟主串没半毛钱关系。直接上模式串!
在这里插入图片描述

KMP算法的改进:

当 AAABAAAAB
与 AAAA
匹配
第一次:
AAABAAAAB
AAAA
第二次:
AAABAAAAB
AAAA
第三次:
AAABAAAAB
AAAA
第四次:
AAABAAAAB
AAAA

看起来挺呆。要是我们一开始就知道这样就好了!因此我们需要比较当前模式串不匹配的字母是否与下一个待匹配的字母相同,如果相同就跳过继续寻找下一个待匹配的字母,直至与该字母不相同。

就比如这种情况:
当“B”匹配失败时候就不必进行第一步了,直接一步到位进行第二步!
请添加图片描述

以上就是我的一些理解。没有具体的代码和算法,仅供理解过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值