【算法学习】KMP入门

KMP算法入门

KMP解决的是模式串 S S 和文本串T之间的匹配问题。传统和暴力算法,在复杂度方面不够优秀,根本原因在于对模式串没有的规律没有加以利用,导致进行了多余的匹配。而KMP算法的关键也在于 next n e x t 数组,求解出了模式串 next n e x t 数组,也就求解出来了对于当前模式串在某一位置失配后,接下来去哪一位置进行匹配的问题。有了这个从而提高在匹配过程中的效率。

next数组的求解

对文本串和模式串进行如下的规定:
|S|=n,|T|=m,S=s0s1sn1,T=t0t1tm1 | S | = n , | T | = m , S = s 0 s 1 … s n − 1 , T = t 0 t 1 … t m − 1

next n e x t 数组的理解,可以为:如果当前在模式串 S S 中的某一位置x发生失配,即在主串 T T 中某一可能的位置y,如果有 sxty s x ≠ t y ,对于模式串来说,应该用其的哪个字符接着和 sx s x 进行比较。

从上述描述中,不难发现,对于主串的指针,在失配的时候是不回退的。而在传统的暴力求解算法上,如果发生了失配,主串的指针是要回退到模式串头部对应主串的位置+1的位置上,这样的回退,显然效率很低。从这个角度上来看,也说明了KMP有很好的效率。

next数组的含义

next n e x t 数组的含义已经说过,其更本质的含义是,对于模式串的某一位置 x x s0s1sx1的前缀和后缀相同的最大长度。这样说还不够具体,用一个实例来描述一下。

假设有模式串 S=ababaca S = a b a b a c a

x x 最长前缀和最长后缀相同的串 最长长度 next
0 a a null0-1
1 ab a b null n u l l 0-1
2 aba a b a a a 1 0
3 abab ab a b 21
4 ababa a b a b a aba a b a 32
5 ababac a b a b a c null n u l l 0-1
6 ababaca a b a b a c a a a 1 0

解释一下上表,如当x=6时,模式串最后发生了失配,也就是最后的 a a 和文本串不匹配,在保证主串指针不回退的情况下,那么主串该和模式串的哪个字符来比较了,显然是第0个字符,也就是开头的a.

再比如,当 x=4 x = 4 的时候发生失配,那么下面就是主串的模式串的第2个字符进行比较。

next数组求解代码

void getnext(){
    int len = strlen(str),k = -1;
    nxt[0] = -1;
    for(int i = 1;i<=len-1;++i){
        while(k>-1&&str[k+1]!=str[i]) k = nxt[k];
        if(str[k+1] == str[i]) k++;
        nxt[i] = k;
    }
}

如何进行匹配

To Be continued T o   B e   c o n t i n u e d

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值