KMP情况简单概括分析

KMP情况概括分析


前言

今天看了KMP,思考了很久,才感觉明白了一点,我觉得这个算法就是两种情况,推荐B站的https://www.bilibili.com/video/BV1Qb411h7U6/
讲的很明白。

一、说明

S是模范串(长),P是模版串(短)。 ne[]用来存储P的最长公共前后缀。 p,s都是从1开始存储的(要是从0开始ne[]会混乱一点)

S: A B C E A B C D
P:A B C D
即P串中没有重复单元,p[0]!=p[1]!=p[2]…
并且ne[]中存储的全是0
开始匹配后我们发现S和P的1.2.3都是一样的,但是从第四项便不一样了。
如果按着暴力算法的话,接下来会从第二项继续尝试匹配
而KMP会将其变为
S: A B C E A B C D
P:--------- A B C D
从中间直接跳过了好几个错误的项,可以理解为因为p中没有重复的既然前几项匹配上了,那跟第一项一定不相等,可以直接跳过,大大的减少了时间复杂度。
2.
S: A B A B A
P :A B A
先计算ne[]
ne[1]=0,ne[2]=0,ne[3]=1(第一项肯定为0,他的子串对应的是a,ab,aba…emmm除了我应该都不会卡在这吧)
开始匹配后我们发现S和P的1.2.3都是一样的,这时候已经匹配完一遍了,这时候会变为
S: A B A B A
P :------A B A
因为ne[3]=1,所以将p移动时会越过错误项直接到与第一项相同的之前子项的位置,大概就是理解为这儿有可能会是一个重新的开始


总结

这是我自己理解后的一个小小的解读,如果你在看那种超详细解说后感觉很迷,可以看看方便理解一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值