KMP模式匹配算法求next数组

KMP模式匹配算法是串部分的一个重要算法,需要知道求next和nextval数组的方法


next数组的求法

next数组中规定下标1、2的字符的next数组值是0、1

从下标为3的字符开始,判断P[i-1]=P[next[i-1]]是否成立

即第i个字符的前一个字符是否和第next[i-1]字符是一样的,

若是一样的———next[i]=next[i-1]+1

若不一样————往前继续找,判断P[i-1]=P[next[next[i-1]]]是否成立,成立则有next[i]=next[next[i-1]]+1

不成立时,一直找到下标为1的字符还不相等的话,next[i]=1



例:P“a b a b a a a b a b a a”

现在来看下标为3的a的next求解过程:

P[3-1]=P[2]='b',  P[next[3-1]]=P[1]='a',故等式不成立,由于已经到达下标为1的元素,故next[3]=1

下标为4的b的next求解过程:

P[4-1]=P[3]='a',P[next[4-1]]=P[1]='a',等式成立,则next[4]=next[3]+1=2

下标为5,6的求解过程同上,算出P[5]=3,P[6]=4

下标为7的next求解过程:

P[7-1]=P[6]='a',P[next[6]]=P[4]='b',等式不成立,继续搜寻,P[next[next[6]]=P[2]='b',依旧不成立,还未回到下标1

继续P[next[next[next[6]]]]=P[1]=‘a’,此时等式成立,故next[7]=next[1]+1=2

.....

next[8]=2,next[9]=3,next[10]=4,next[11]=5,next[12]=6



nextval数组求法



1.先求出next数组的值

2.第一位nextval必为0

3.第二位的next[2]=1,故与下标为1的字符比较,b与a不同,故第二位的nextval[2]=next[2]=1

4.第三位的next[3]=1,与下标为1的字符比较,字符相同,故第三位的next[3]=next[1]=0

.....重复步骤


也就是说,第一位固定nextval[1]=0,

从第二位开始,把第i位字符与第next[i]位的字符比较,

若字符相同,则  nextval[i]=nextval[next[i]];

若字符不同,则 nextval[i]=next[i]



KMP算法与BF(普通匹配)算法的比较


假设串长n,模式串长m

BF算法:

时间复杂度O(m*n)

空间复杂度O(1)

KMP算法:

时间复杂度O(m+n)

空间复杂度O(m)    涉及next数组的存储,而next数组是基于模式串长度计算的


  • 16
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值